Scroll to navigation

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