std::expected(3) | C++ Standard Libary | std::expected(3) |
NAME¶
std::expected - std::expected
Synopsis¶
Defined in header <expected>
template< class T, class E > (since C++23)
class expected;
The class template std::expected provides a way to store either of two
values. An
object of std::expected at any given time either holds an expected value of
type T,
or an unexpected value of type E. std::expected is never valueless.
The stored value is allocated directly within the storage occupied by the
expected
object. No dynamic memory allocation takes place.
A program is ill-formed if it instantiates an expected with a reference type,
a
function type, or a specialization of std::unexpected. In addition, T must
not be
std::in_place_t or std::unexpect_t.
Template parameters¶
the type of the expected value. The type must either be (possibly
cv-qualified)
T - void, or meet the Destructible requirements (in particular, array and
reference
types are not allowed).
the type of the unexpected value. The type must meet the Destructible
E - requirements, and must be a valid template argument for std::unexpected
(in
particular, arrays, non-object types, and cv-qualified types are not
allowed).
Member types¶
Member type Definition
value_type T
error_type E
unexpected_type std::unexpected<E>
Member alias templates¶
Type Definition
rebind<U> expected<U, error_type>
Member functions¶
constructor constructs the expected object
(public member function)
destructor destroys the expected object, along with its contained value
(public member function)
operator= assigns contents
(public member function)
Observers¶
operator-> accesses the expected value
operator* (public member function)
operator bool checks whether the object contains an expected value
has_value (public member function)
value returns the expected value
(public member function)
error returns the unexpected value
(public member function)
value_or returns the expected value if present, another value otherwise
(public member function)
Monadic operations
returns the result of the given function on the expected value if it
and_then exists; otherwise, returns the expected itself
(public member function)
returns an expected containing the transformed expected value if it
transform exists; otherwise, returns the expected itself
(public member function)
returns the expected itself if it contains an expected value;
or_else otherwise, returns the result of the given function on the
unexpected value
(public member function)
returns the expected itself if it contains an expected value;
transform_error otherwise, returns an expected containing the transformed
unexpected
value
(public member function)
Modifiers¶
emplace constructs the expected value in-place
(public member function)
swap exchanges the contents
(public member function)
Non-member functions¶
operator== compares expected objects
(C++23) (function template)
swap(std::expected) specializes the std::swap algorithm
(C++23) (function)
Helper classes¶
unexpected represented as an unexpected value
(C++23) (class template)
bad_expected_access exception indicating checked access to an expected that
contains
(C++23) an unexpected value
(class template)
unexpect in-place construction tag for unexpected value in expected
unexpect_t (tag)
(C++23)
Notes¶
Types with the same functionality are called Result in Rust and Either in Haskell.
Feature-test macro Value Std Feature
202202L (C++23) class template std::expected and associated
__cpp_lib_expected helper classes
202211L (C++23) Monadic functions for std::expected
Example¶
// Run this code
#include <cmath>
#include <expected>
#include <iomanip>
#include <iostream>
#include <string_view>
enum class parse_error
{
invalid_input,
overflow
};
auto parse_number(std::string_view& str) -> std::expected<double,
parse_error>
{
const char* begin = str.data();
char* end;
double retval = std::strtod(begin, &end);
if (begin == end)
return std::unexpected(parse_error::invalid_input);
else if (std::isinf(retval))
return std::unexpected(parse_error::overflow);
str.remove_prefix(end - begin);
return retval;
}
int main()
{
auto process = [](std::string_view str)
{
std::cout << "str: " << std::quoted(str) <<
", ";
if (const auto num = parse_number(str); num.has_value())
std::cout << "value: " << *num << '\n';
// If num did not have a value, dereferencing num
// would cause an undefined behavior, and
// num.value() would throw std::bad_expected_access.
// num.value_or(123) uses specified default value 123.
else if (num.error() == parse_error::invalid_input)
std::cout << "error: invalid input\n";
else if (num.error() == parse_error::overflow)
std::cout << "error: overflow\n";
else
std::cout << "unexpected!\n"; // or invoke
std::unreachable();
};
for (auto src : {"42", "42abc", "meow",
"inf"})
process(src);
}
Output:¶
str: "42", value: 42
str: "42abc", value: 42
str: "meow", error: invalid input
str: "inf", error: overflow
References¶
* C++23 standard (ISO/IEC 14882:2023):
* 22.8 Expected objects [expected]
See also¶
variant a type-safe discriminated union
(C++17) (class template)
optional a wrapper that may or may not hold an object
(C++17) (class template)
2024.06.10 | http://cppreference.com |