Namespaces
Variants
Actions

std::optional<T>::or_else

From cppreference.com
< cpp‎ | utility‎ | optional
 
 
 
 
template<class F >
constexpr optional or_else( F&& f )const&;
(1) (since C++23)
template<class F >
constexpr optional or_else( F&& f )&&;
(2) (since C++23)

Returns *this if it contains a value. Otherwise, returns the result of f.

The program is ill-formed if std::remove_cvref_t<std::invoke_result_t<F>> is not same as std::optional<T>.

1) Equivalent to return*this ?*this :std::forward<F>(f)();. This overload participates in overload resolution only if both std::copy_constructible<T> and std::invocable<F> are modeled.
2) Equivalent to return*this ? std::move(*this):std::forward<F>(f)();. This overload participates in overload resolution only if both std::move_constructible<T> and std::invocable<F> are modeled.

Contents

[edit]Parameters

f - a function or Callable object that returns an std::optional<T>

[edit]Return value

*this or the result of f, as described above.

[edit]Notes

Feature-test macroValueStdFeature
__cpp_lib_optional202110L(C++23)Monadic operations in std::optional

[edit]Example

#include <iostream>#include <optional>#include <string>   int main(){using maybe_int =std::optional<int>;   auto valueless =[]{std::cout<<"Valueless: ";return maybe_int{0};};   maybe_int x;std::cout<< x.or_else(valueless).value()<<'\n';   x =42;std::cout<<"Has value: ";std::cout<< x.or_else(valueless).value()<<'\n';   x.reset();std::cout<< x.or_else(valueless).value()<<'\n';}

Output:

Valueless: 0 Has value: 42 Valueless: 0

[edit]See also

returns the contained value if available, another value otherwise
(public member function)[edit]
(C++23)
returns the result of the given function on the contained value if it exists, or an empty optional otherwise
(public member function)[edit]
(C++23)
returns an optional containing the transformed contained value if it exists, or an empty optional otherwise
(public member function)[edit]
close