std::expected<T,E>::expected
Начиная с ru.cppreference.net
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.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)
|
представлен как неожиданное значение
(шаблон класса) |
|
тег для конструирования на месте
(тег) |
|
|
(C++23)
|
тег для конструирования на месте неожиданного значения в
expected
(тег) |