std::expected - cppreference.com

From cppreference.com

Defined in header

<expected>

template<classT,classE>classexpected; (1) (since C++23)template<classT,classE>requiresstd::is_void_v<T>classexpected<T,E>; (2) (since C++23)The class template std::expected provides a way to represent either of two values: an expected value of type T, or an unexpected value of type E. expected is never valueless.

1) The main template. Contains the expected or unexpected value within its own storage, which is

nested within

the expected object.

2) The void partial specialization. Represents an expected void value or contains an unexpected value. If it contains an unexpected value, it is nested within the expected object.

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

T - the type of the expected value. The type must either be (possibly cv-qualified) void, or meet the

Destructible

requirements (in particular, array and reference types are not allowed). E - the type of the unexpected value. The type must meet the

Destructible

requirements, and must be a valid template argument for

std::unexpected

(in particular, arrays, non-object types, and cv-qualified types are not allowed). Nested types

Member templates

Template Definition rebind<U>std::expected<U,error_type>Data members

Member Description boolhas_valwhether the expected object currently represents the expected value
(exposition-only member object*)Tval(main template only)the expected value
(exposition-only variant member object*)Eunexthe unexpected value
(exposition-only variant member object*)Member functions

(constructor)

constructs the expected object
(public member function)

[edit]

(destructor)

destroys the expected object, along with its contained value
(public member function)

[edit]

operator=

assigns contents
(public member function)

[edit]

Observers

operator->operator*

accesses the expected value
(public member function)

[edit]

operator boolhas_value

checks whether the object contains an expected value
(public member function)

[edit]

value

returns the expected value
(public member function)

[edit]

error

returns the unexpected value
(public member function)

[edit]

value_or

returns the expected value if present, another value otherwise
(public member function)

[edit]

error_or

returns the unexpected value if present, another value otherwise
(public member function)

[edit]

Monadic operations

and_then

returns the result of the given function on the expected value if it exists; otherwise, returns the expected itself
(public member function)

[edit]

transform

returns an expected containing the transformed expected value if it exists; otherwise, returns the expected itself
(public member function)

[edit]

or_else

returns the expected itself if it contains an expected value; otherwise, returns the result of the given function on the unexpected value
(public member function)

[edit]

transform_error

returns the expected itself if it contains an expected value; otherwise, returns an expected containing the transformed unexpected value
(public member function)

[edit]

Modifiers

emplace

constructs the expected value in-place
(public member function)

[edit]

swap

exchanges the contents
(public member function)

[edit]

Non-member functions

Helper classes

Notes

Types with the same functionality are called

Result

in Rust and

Either

in Haskell.

Feature-test

macro ValueStdFeature

__cpp_lib_expected

202202L

(C++23)class template std::expected and associated

helper classes

202211L

(C++23)Monadic functions for std::expectedExample

Run this code

#include<cmath>#include<expected>#include<iomanip>#include<iostream>#include<string_view>enumclassparse_error{invalid_input,overflow};autoparse_number(std::string_view&str)->std::expected<double,parse_error>{constchar*begin=str.data();char*end;doubleretval=std::strtod(begin,&end);if(begin==end)returnstd::unexpected(parse_error::invalid_input);elseif(std::isinf(retval))returnstd::unexpected(parse_error::overflow);str.remove_prefix(end-begin);returnretval;}intmain(){autoprocess=[](std::string_viewstr){std::cout<<"str: "<<std::quoted(str)<<", ";if(constautonum=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.elseif(num.error()==parse_error::invalid_input)std::cout<<"error: invalid input\n";elseif(num.error()==parse_error::overflow)std::cout<<"error: overflow\n";elsestd::cout<<"unexpected!\n";// or invoke std::unreachable();};for(autosrc:{"42","42abc","meow","inf"})process(src);}Output:

str: "42", value: 42 str: "42abc", value: 42 str: "meow", error: invalid input str: "inf", error: overflow Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior

LWG 4141

C++23 the requirement of storage
allocation was confusing the contained object must be
nested within the expected object References

C++23 standard (ISO/IEC 14882:2024):

22.8 Expected objects [expected]

See also

(C++17)

a type-safe discriminated union
(class template)

[edit]

(C++17)

a wrapper that may or may not hold an object
(class template)

[edit]