Namespaces
Variants

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

Начиная с ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы проверки возможностей библиотеки (C++20)
Утилиты программы
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Реляционные операторы (устарело в C++20)
 
 
constexpr expected();
(1) (начиная с C++23)
constexpr expected( const expected& other );
(2) (начиная с C++23)
constexpr expected( expected&& other ) noexcept(/* see below */);
(3) (начиная с C++23)
template< class U, class G >
constexpr explicit(/* see below */) expected( const expected<U, G>& other );
(4) (начиная с C++23)
template< class U, class G >
constexpr explicit(/* see below */) expected( expected<U, G>&& other );
(5) (начиная с C++23)
template< class U = std::remove_cv_t<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)
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() является 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:
    • 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) Конструирует объект, который содержит неожидаемое значение, которое прямо инициализируется из аргументов std::forward<Args>(args)....
После конструирования has_value() возвращает false.
Эта перегрузка участвует в разрешении перегрузки только если 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 - список инициализации, используемый для инициализации содержащегося значения

Исключения

Пример

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 3886 C++23 аргумент шаблона по умолчанию для перегрузки ( 6 ) был T изменён на std:: remove_cv_t < T >

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

(C++23)
представлен как неожиданное значение
(шаблон класса)
тег для конструирования на месте
(тег)
тег для конструирования на месте неожиданного значения в expected
(тег)