std::expected<T,E>::expected
constexpr expected() noexcept(/* see below */); |
(1) | (since C++23) |
constexpr expected( const expected& other ); |
(2) | (since C++23) |
constexpr expected( expected&& other ) noexcept(/* see below */); |
(3) | (since C++23) |
template< class U, class G > constexpr explicit(/* see below */) expected( const expected<U, G>& other ); |
(4) | (since C++23) |
template< class U, class G > constexpr explicit(/* see below */) expected( expected<U, G>&& other ); |
(5) | (since C++23) |
template< class U = T > constexpr explicit(!std::is_convertible_v<U, T>) expected( U&& v ); |
(6) | (since C++23) (T is not cv void) |
template< class G > constexpr explicit(!std::is_convertible_v<const G&, E>) |
(7) | (since C++23) |
template< class G > constexpr explicit(!std::is_convertible_v<G, E>) |
(8) | (since C++23) |
template< class... Args > constexpr explicit expected( std::in_place_t, Args&&... args ); |
(9) | (since C++23) (T is not cv void) |
template< class U, class... Args > constexpr explicit expected( std::in_place_t, |
(10) | (since C++23) (T is not cv void) |
template< class... Args > constexpr explicit expected( std::in_place_t ) noexcept; |
(11) | (since C++23) (T is cv void) |
template< class... Args > constexpr explicit expected( std::unexpect_t, Args&&... args ); |
(12) | (since C++23) |
template< class U, class... Args > constexpr explicit expected( std::unexpect_t, |
(13) | (since C++23) |
Constructs a new expected
object.
T
is not (possibly cv-qualified) void, constructs an object that contains an expected value, which is value-initialized.
After construction, has_value()
returns true.
- This overload participates in overload resolution only if
T
is (possibly cv-qualified) void or std::is_default_constructible_v<T> is true.
T
is not (possibly cv-qualified) void, the new object contains an expected value, which is direct-initialized from *other.
After construction, has_value()
is equal to other.has_value().
- This constructor is defined as deleted unless
- either
T
is (possibly cv-qualified) void, or std::is_copy_constructible_v<T> is true, and - std::is_copy_constructible_v<E> is true.
- either
- This constructor is trivial if
- either
T
is (possibly cv-qualified) void, or std::is_trivially_copy_constructible_v<T> is true, and - std::is_trivially_copy_constructible_v<E> is true.
- either
T
is not (possibly cv-qualified) void, the new object contains an expected value, which is direct-initialized from std::move(*other).
After construction, has_value()
is equal to other.has_value().
- This constructor participates in overload resolution only if
- either
T
is (possibly cv-qualified) void, or std::is_move_constructible_v<T> is true, and - std::is_move_constructible_v<E> is true.
- either
- This constructor is trivial if
- std::is_trivially_move_constructible_v<T> is true, and
- std::is_trivially_move_constructible_v<E> is true.
-
UF
be std::add_lvalue_reference_t<const U> for (4) andU
for (5), and -
GF
be const G& for (4) andG
for (5).
If other.has_value()
is false, the new object contains an unexpected value, which is direct-initialized from std::forward<GF>(other.error()). Otherwise, if T
is not (possibly cv-qualified) void, the new object contains an expected value, which is direct-initialized from std::forward<UF>(*other).
After construction, has_value()
is equal to other.has_value().
- Each of these constructors does not participate in overload resolution unless the following conditions are met respectively:
- Either
-
T
is (possibly cv-qualified) void, and std::is_void_v<U> is true, or - std::is_constructible_v<T, UF> is true.
-
- std::is_constructible_v<E, GF> is true.
- If
T
is not (possibly cv-qualified bool),T
is not constructible or convertible from any expression of type (possibly const) std::expected<U, G>, i.e., the following 8 values are all 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> is not constructible from any expression of type (possibly const) std::expected<U, G>, i.e., the following 4 values are all 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>
- Either
- These constructors are explicit if std::is_convertible_v<UF, T> or std::is_convertible_v<GF, E> is false.
T
with the expression std::forward<U>(v).
After construction, has_value()
returns true.
- This constructor does not participate in overload resolution unless the following conditions are met:
-
T
is not (possibly cv-qualified) void. - std::is_same_v<std::remove_cvref_t<U>, std::in_place_t> is false.
- std::is_same_v<expected, std::remove_cvref_t<U>> is false.
- std::is_constructible_v<T, U> is true.
- std::remove_cvref_t<U> is not a specialization of
std::unexpected
. - If
T
is (possibly cv-qualified) bool, std::remove_cvref_t<U> is not a specialization ofstd::expected
.
-
GF
be const G& for (7) and G
for (8).
Constructs an object that contains an unexpected value, which is direct-initialized from std::forward<GF>(e.error()).
After construction, has_value()
returns false.
- These overloads participate in overload resolution only if std::is_constructible_v<E, GF> is true.
After construction, has_value()
returns true.
- This overload participates in overload resolution only if std::is_constructible_v<T, Args...> is true.
After construction, has_value()
returns true.
- This overload participates in overload resolution only if std::is_constructible_v<T, std::initializer_list<U>&, Args...> is true.
After construction, has_value()
returns false.
- This overload participates in overload resolution only if std::is_constructible_v<E, Args...> is true.
After construction, has_value()
returns false.
- This overload participates in overload resolution only if std::is_constructible_v<E, std::initializer_list<U>&, Args...> is true.
Parameters
other | - | another expected object whose contained value is copied
|
e | - | std::unexpected object whose contained value is copied
|
v | - | value with which to initialize the contained value |
args... | - | arguments with which to initialize the contained value |
il | - | initializer list with which to initialize the contained value |
Exceptions
T
.
If T
is (possibly cv-qualified) void, T
or E
.T
is (possibly cv-qualified) void,
&& std::is_nothrow_move_constructible_v<E>)
T
or E
.T
.E
.T
.E
.Example
This section is incomplete Reason: no example |
See also
(C++23) |
represented as an unexpected value (class template) |
in-place construction tag (class template) | |
(C++23) |
in-place construction tag for unexpected value in expected (class) (constant) |