std::unexpected(3) | C++ Standard Libary | std::unexpected(3) |
NAME¶
std::unexpected - std::unexpected
Synopsis¶
Defined in header <expected>
template< class E > (since C++23)
class unexpected;
The class template std::unexpected represents an unexpected value stored in
std::expected. In particular, std::expected has constructors with
std::unexpected as
a single argument, which creates an expected object that contains an
unexpected
value.
A program is ill-formed if it instantiates an unexpected with a non-object
type, an
array type, a specialization of std::unexpected, or a cv-qualified type.
Template parameters¶
E - the type of the unexpected value. The type must not be an
array type, a
non-object type, a specialization of std::unexpected, or a cv-qualified
type.
Member functions¶
constructor constructs the unexpected object
(C++23) (public member function)
destructor destroys the unexpected object, along with the stored
(implicitly declared) (C++23) value
(public member function)
operator= assigns the stored value
(implicitly declared) (C++23) (public member function)
error accesses the stored value
(C++23) (public member function)
swap swaps the stored value
(C++23) (public member function)
Non-member functions¶
operator== compares the stored value
(C++23) (function template)
swap(std::unexpected) specializes the std::swap algorithm
(C++23) (function template)
std::unexpected::unexpected
constexpr unexpected( const unexpected& ) = default; (1) (since
C++23)
constexpr unexpected( unexpected&& ) = default; (2) (since
C++23)
template< class Err = E > (3) (since C++23)
constexpr explicit unexpected( Err&& e );
template< class... Args > (4) (since C++23)
constexpr explicit unexpected( std::in_place_t, Args&&... args );
template< class U, class... Args >
constexpr explicit unexpected( std::in_place_t, (5) (since C++23)
std::initializer_list<U> il,
Args&&... args );
Constructs a std::unexpected object.
1,2) Copy/move constructor. Copies or moves the stored value, respectively.
3) Constructs the stored value, as if by direct-initializing a value of type
E from
std::forward<Err>(e).
* This overload participates in overload resolution only if
* std::is_same_v<std::remove_cvref_t<Err>, unexpected> is false,
and
* std::is_same_v<std::remove_cvref_t<Err>, std::in_place_t> is
false, and
* std::is_constructible_v<E, Err> is true.
4) Constructs the stored value, as if by direct-initializing a value of type
E from
the arguments std::forward<Args>(args)....
* This overload participates in overload resolution only if
std::is_constructible_v<E, Args...> is true.
5) Constructs the stored value, as if by direct-initializing a value of type
E from
the arguments il, std::forward<Args>(args)....
* This overload participates in overload resolution only if
std::is_constructible_v<E, std::initializer_list<U>&,
Args...> is true.
Parameters¶
e - 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¶
Throws any exception thrown by the constructor of E.
std::unexpected::error
constexpr const E& error() const& noexcept;
constexpr E& error() & noexcept; (since C++23)
constexpr const E&& error() const&& noexcept;
constexpr E&& error() && noexcept;
Returns a reference to the stored value.
std::unexpected::swap
constexpr void swap( unexpected& other ) (since C++23)
noexcept(std::is_nothrow_swappable_v<E>);
Swaps the stored values, as if by using std::swap; swap(error(),
other.error());.
The program is ill-formed if std::is_swappable_v<E> is false.
operator==(std::unexpected)
template< class E2 >
friend constexpr bool operator==( unexpected& x,
std::unexpected<E2>& (since C++23)
y );
Compares the stored values, as if by return x.error() == y.error().
If the expression x.error() == e.error() is not well-formed, or if its result
is not
convertible to bool, the program is ill-formed.
This function is not visible to ordinary unqualified or qualified lookup, and
can
only be found by argument-dependent lookup when std::unexpected<E> is
an associated
class of the arguments.
swap(std::unexpected)
friend constexpr void (since C++23)
swap( unexpected& x, unexpected& y )
noexcept(noexcept(x.swap(y)));
Equivalent to x.swap(y).
This overload participates in overload resolution only if
std::is_swappable_v<E> is
true.
This function is not visible to ordinary unqualified or qualified lookup, and
can
only be found by argument-dependent lookup when std::unexpected<E> is
an associated
class of the arguments.
Deduction guides
template< class E > (since C++23)
unexpected(E) -> unexpected<E>;
The deduction guide is provided for unexpected to allow deduction from the
constructor argument.
Notes¶
Prior to C++17, the name std::unexpected denoted the function
called by the C++
runtime when a dynamic exception specification was violated.
Example¶
// Run this code
#include <expected>
#include <iostream>
int main()
{
std::expected<double, int> ex = std::unexpected(3);
if (!ex)
std::cout << "ex contains an error value\n";
if (ex == std::unexpected(3))
std::cout << "The error value is equal to 3\n";
}
Output:¶
ex contains an error value
The error value is equal to 3
Example with enum
// Run this code
#include <expected>
#include <iostream>
enum class error
{
compile_time_error,
runtime_error
};
[[nodiscard]] auto unexpected_runtime_error() -> std::expected<int,
error>
{
return std::unexpected(error::runtime_error);
}
int main()
{
const auto e = unexpected_runtime_error();
e.and_then([](const auto& e) -> std::expected<int, error> {
std::cout << "and_then: " << int(e); // not printed
return {};
}).or_else([](const auto& e) -> std::expected<int, error> {
std::cout << "or_else: " << int(e); // prints this line
return {};
});
return 0;
}
Output:¶
or_else: 1
See also¶
constructor constructs the expected object
(public member function)
operator== compares expected objects
(C++23) (function template)
2024.06.10 | http://cppreference.com |