5.9 KiB
[optional.monadic]
22 General utilities library [utilities]
22.5 Optional objects [optional]
22.5.3 Class template optional [optional.optional]
22.5.3.8 Monadic operations [optional.monadic]
template<class F> constexpr auto and_then(F&& f) &; template<class F> constexpr auto and_then(F&& f) const &;
Let U be invoke_result_t<F, decltype(*val)>.
Mandates: remove_cvref_t is a specialization of optional.
Effects: Equivalent to:if (*this) {return invoke(std::forward(f), *val);} else {return remove_cvref_t();}
template<class F> constexpr auto and_then(F&& f) &&; template<class F> constexpr auto and_then(F&& f) const &&;
Let U be invoke_result_t<F, decltype(std::move(*val))>.
Mandates: remove_cvref_t is a specialization of optional.
Effects: Equivalent to:if (*this) {return invoke(std::forward(f), std::move(*val));} else {return remove_cvref_t();}
template<class F> constexpr auto transform(F&& f) &; template<class F> constexpr auto transform(F&& f) const &;
Let U be remove_cv_t<invoke_result_t<F, decltype(*val)>>.
Mandates: U is a valid contained type for optional.
The declarationU u(invoke(std::forward(f), *val)); is well-formed for some invented variable u.
[Note 1:
There is no requirement that U is movable ([dcl.init.general]).
â end note]
Returns: If *this contains a value, an optional object whose contained value is direct-non-list-initialized withinvoke(std::forward(f), *val); otherwise, optional().
template<class F> constexpr auto transform(F&& f) &&; template<class F> constexpr auto transform(F&& f) const &&;
Let U beremove_cv_t<invoke_result_t<F, decltype(std::move(*val))>>.
Mandates: U is a valid contained type for optional.
The declarationU u(invoke(std::forward(f), std::move(*val))); is well-formed for some invented variable u.
[Note 2:
There is no requirement that U is movable ([dcl.init.general]).
â end note]
Returns: If *this contains a value, an optional object whose contained value is direct-non-list-initialized withinvoke(std::forward(f), std::move(*val)); otherwise, optional().
template<class F> constexpr optional or_else(F&& f) const &;
Constraints: F models invocable andT models copy_constructible.
Mandates: is_same_v<remove_cvref_t<invoke_result_t>, optional> is true.
Effects: Equivalent to:if (*this) {return *this;} else {return std::forward(f)();}
template<class F> constexpr optional or_else(F&& f) &&;
Constraints: F models invocable andT models move_constructible.
Mandates: is_same_v<remove_cvref_t<invoke_result_t>, optional> is true.
Effects: Equivalent to:if (*this) {return std::move(*this);} else {return std::forward(f)();}