std::expected<T,E>::expected
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.
T не является (возможно, cv-квалифицированным) void, создаёт объект, содержащий ожидаемое значение, которое инициализируется значением.
После создания, has_value() возвращает значение true.
- Эта перегрузка участвует в разрешении перегрузки, только если
Tравно (возможно, cv-квалифицированному)voidилиstd::is_default_constructible_v<T>равноtrue.
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.
- либо
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.
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.
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.
GF будет const G& для (7) и G для (8).
Создаёт объект, содержащий неожидаемое значение, которое напрямую инициализируется из std::forward<GF>(e.error()).
После создания has_value() возвращает false.
- Эти перегрузки участвуют в разрешении перегрузки, только если
std::is_constructible_v<E, GF>равноtrue.
std::forward<Args>(args)....
После создания has_value() возвращает true.
- Эта перегрузка участвует в разрешении перегрузки, только если
std::is_constructible_v<T, Args...>равноtrue.
il, std::forward<Args>(args)....
После создания has_value() возвращает true.
- Эта перегрузка участвует в разрешении перегрузки, только если
std::is_constructible_v<T, std::initializer_list<U>&, Args...>равноtrue.
il, std::forward<Args>(args)....
После создания has_value() возвращает true.
- Эта перегрузка участвует в разрешении перегрузки, только если
std::is_constructible_v<E, Args...>равноtrue.
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 | — | список инициализаторов для инициализации содержащегося значения |
Исключения
T.
Если T является (возможно, cv-квалифицированным) void, noexceptT или E.T является (возможно, cv-квалифицированным) void,
noexcept(std::is_nothrow_move_constructible_v<E>)noexcept(std::is_nothrow_move_constructible_v<T> && std::is_nothrow_move_constructible_v<E>)T или E.T.E.T.E.Пример
| Этот раздел не завершён Причина: нет примера |
Смотрите также
(C++23) |
представлен как неожидаемое значение (шаблон класса) |
| тэг конструирования на месте (шаблон класса) | |
(C++23) |
тег создания на месте для неожидаемого значения в expected (класс) (константа) |