Пространства имён
Варианты
Действия

std::expected<T,E>::expected

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
<tbody> </tbody>
constexpr expected() noexcept(/* смотрите ниже */);
(1) (начиная с C++23)
constexpr expected( const expected& other );
(2) (начиная с C++23)
constexpr expected( expected&& other ) noexcept(/*смотрите ниже*/);
(3) (начиная с C++23)
template< class U, class G > constexpr explicit(/*смотрите ниже*/) expected( const expected<U, G>& other );
(4) (начиная с C++23)
template< class U, class G > constexpr explicit(/*смотрите ниже*/) expected( expected<U, G>&& other );
(5) (начиная с C++23)
template< class U = T > constexpr explicit(!std::is_convertible_v<U, T>) expected( U&& v );
(6) (начиная с C++23)
(T не является cv void)
template< class G > constexpr explicit(!std::is_convertible_v<const G&, E>) expected( const std::unexpected<G>& e );
(7) (начиная с C++23)
template< class G > constexpr explicit(!std::is_convertible_v<G, E>) expected( std::unexpected<G>&& e );
(8) (начиная с C++23)
template< class... Args > constexpr explicit expected( std::in_place_t, Args&&... args );
(9) (начиная с C++23)
(T не является cv void)
template< class U, class... Args > constexpr explicit expected( std::in_place_t, std::initializer_list<U> il, Args&&... args );
(10) (начиная с C++23)
(T не является cv void)
template< class... Args > constexpr explicit expected( std::in_place_t ) noexcept;
(11) (начиная с C++23)
(T является cv void)
template< class... Args > constexpr explicit expected( std::unexpect_t, Args&&... args );
(12) (начиная с C++23)
template< class U, class... Args > constexpr explicit expected( std::unexpect_t, std::initializer_list<U> il, Args&&... args );
(13) (начиная с C++23)

Создаёт новый объект expected.

1) Конструктор по умолчанию. Если T не является (возможно, cv-квалифицированным) void, создаёт объект, содержащий ожидаемое значение, которое инициализируется значением.

После создания, has_value() возвращает значение true.

  • Эта перегрузка участвует в разрешении перегрузки, только если T равно (возможно, cv-квалифицированному) void или std::is_default_constructible_v<T> равно true.
2) Конструктор копирования. Если other.has_value() имеет значение false, новый объект содержит неожидаемое значение, которое инициализируется напрямую из other.error(). Иначе, если T не является (возможно, cv-квалифицированным) void, новый объект содержит ожидаемое значение, которое напрямую инициализируется из *other.

После создания has_value() равно other.has_value().

  • Этот конструктор определяется как удалённый, если только
    • либо T является (возможно, cv-квалифицированным) void, или std::is_copy_constructible_v<T> равно true, и
    • std::is_copy_constructible_v<E> равно true.
  • Этот конструктор тривиален, если
    • либо T является (возможно, cv-квалифицированным) void, или std::is_trivially_copy_constructible_v<T> равно true, и
    • std::is_trivially_copy_constructible_v<E> равно true.
3) Конструктор перемещения. Если other.has_value() равно {c|false}}, новый объект содержит неожидаемое значение, которое напрямую инициализируется из std::move(other.error()). Иначе, если T не является (возможно, cv-квалифицированным) void, новый объект содержит ожидаемое значение, которое напрямую инициализируется из std::move(*other).

После создания has_value() равно other.has_value().

  • Этот конструктор участвует в разрешении перегрузки, только если
    • либо T является (возможно, cv-квалифицированным) void, или std::is_move_constructible_v<T> равно true, и
    • std::is_move_constructible_v<E> равно true.
  • Этот конструктор тривиален, если
    • std::is_trivially_move_constructible_v<T> равно true, и
    • std::is_trivially_move_constructible_v<E> равно true.
4,5) Пусть
  • UF будет std::add_lvalue_reference_t<const U> для (4) и U для (5), и
  • GF будет const G& для (4) и G для (5).

Если other.has_value() имеет значение false, новый объект содержит неожидаемое значение, которое напрямую инициализируется из std::forward<GF>(other.error()). Иначе, если T не является (возможно, cv-квалифицированным) void, новый объект содержит ожидаемое значение, которое напрямую инициализируется из std::forward<UF>(*other). После создания has_value() равно other.has_value().

  • Каждый из этих конструкторов не участвует в разрешении перегрузки, если не выполняются следующие условия:
    • или
      • T равно (возможно, cv-квалифицированному) void, и std::is_void_v<U> равно true, или
      • std::is_constructible_v<T, UF> равно true, и
    • std::is_constructible_v<E, GF> равно true, и
    • Если T не является (возможно, cv-квалифицированным bool), T нельзя построить или преобразовать из любого выражения типа (возможно, const) std::expected<U, G>, т.е. все следующие 8 значений равны false:
      • std::is_constructible_v<T, std::expected<U, G>&
      • std::is_constructible_v<T, std::expected<U, G>
      • std::is_constructible_v<T, const std::expected<U, G>&
      • std::is_constructible_v<T, const std::expected<U, G>
      • std::is_convertible_v<std::expected<U, G>&, T>
      • std::is_convertible_v<std::expected<U, G>, T>
      • std::is_convertible_v<const std::expected<U, G>&, T>
      • std::is_convertible_v<const std::expected<U, G>, T>
    • std::unexpected<E> не может быть построен ни из какого выражения типа (возможно, const) std::expected<U, G>, то есть все следующие 4 значения false: false:
      • std::is_constructible_v<std::unexpected<E>, std::expected<U, G>&
      • std::is_constructible_v<std::unexpected<E>, std::expected<U, G>
      • std::is_constructible_v<std::unexpected<E>, const std::expected<U, G>&
      • std::is_constructible_v<std::unexpected<E>, const std::expected<U, G>
  • Эти конструкторы являются explicit, если std::is_convertible_v<UF, T> или std::is_convertible_v<GF, E> равно false.
6) Создаёт объект, который содержит ожидаемое значение, инициализированное как при прямой инициализации (но не прямой инициализацией списком) объекта типа T с выражением std::forward<U>(v).

После создания has_value() возвращает true.

  • Этот конструктор не участвует в разрешении перегрузки, если не выполняются следующие условия:
    • T не является (возможно, cv-квалифицированным) void, и
    • std::is_same_v<std::remove_cvref_t<U>, std::in_place_t> равно false, и
    • std::is_same_v<expected, std::remove_cvref_t<U>> равно false, и
    • std::is_constructible_v<T, U> равно true.
    • std::remove_cvref_t<U> не является специализацией std::unexpected.
    • Если T является (возможно, cv-квалифицированным) bool, std::remove_cvref_t<U> не является специализацией std::expected.
7,8) Пусть GF будет const G& для (7) и G для (8).

Создаёт объект, содержащий неожидаемое значение, которое напрямую инициализируется из std::forward<GF>(e.error()). После создания has_value() возвращает false.

  • Эти перегрузки участвуют в разрешении перегрузки, только если std::is_constructible_v<E, GF> равно true.
9) Создаёт объект, содержащий ожидаемое значение, которое напрямую инициализируется из аргументов std::forward<Args>(args)....

После создания has_value() возвращает true.

  • Эта перегрузка участвует в разрешении перегрузки, только если std::is_constructible_v<T, Args...> равно true.
10) Создаёт объект, содержащий ожидаемое значение, которое напрямую инициализируется из аргументов il, std::forward<Args>(args)....

После создания has_value() возвращает true.

  • Эта перегрузка участвует в разрешении перегрузки, только если std::is_constructible_v<T, std::initializer_list<U>&, Args...> равно true.
11) Создаёт объект таким образом, что после создания has_value() возвращает true.
12) Создаёт объект, содержащий неожидаемое значение, которое напрямую инициализируется из аргументов il, std::forward<Args>(args)....

После создания has_value() возвращает true.

  • Эта перегрузка участвует в разрешении перегрузки, только если std::is_constructible_v<E, Args...> равно true.
13) Создаёт объект, содержащий неожидаемое значение, которое напрямую инициализируется из аргументов il, std::forward<Args>(args)....

После создания has_value() возвращает false.

  • Эта перегрузка участвует в разрешении перегрузки, только если std::is_constructible_v<E, std::initializer_list<U>&, Args...> равно true.

Параметры

other другой объект expected, содержащееся в котором значение копируется
e std::unexpected, содержащееся в котором значение копируется
v значение для инициализации содержащегося значения
args... аргументы для инициализации содержащегося значения
il список инициализаторов для инициализации содержащегося значения

Исключения

1) Генерирует любое исключение, созданное конструктором T. Если T является (возможно, cv-квалифицированным) void,
спецификация noexcept:  
noexcept
  
2) Генерирует любое исключение, созданное конструктором T или E.
3) Если T является (возможно, cv-квалифицированным) void,
спецификация noexcept:  
noexcept(std::is_nothrow_move_constructible_v<E>)
Иначе
спецификация noexcept:  
noexcept(std::is_nothrow_move_constructible_v<T> && std::is_nothrow_move_constructible_v<E>)
4,5) Генерирует любое исключение, созданное конструктором T или E.
6) Генерирует любое исключение, созданное конструктором T.
7-8) Генерирует любое исключение, созданное конструктором E.
9-10) Генерирует любое исключение, созданное конструктором T.
12,13) Генерирует любое исключение, созданное конструктором E.

Пример

Смотрите также

представлен как неожидаемое значение
(шаблон класса) [править]
тэг конструирования на месте
(шаблон класса) [править]
тег создания на месте для неожидаемого значения в expected
(класс) (константа) [править]