[expected.object.monadic] (original) (raw)
22 General utilities library [utilities]
22.8 Expected objects [expected]
22.8.6 Class template expected [expected.expected]
22.8.6.7 Monadic operations [expected.object.monadic]
template<class F> constexpr auto and_then(F&& f) &;template<class F> constexpr auto and_then(F&& f) const &;
Let U be remove_cvref_t<invoke_result_t<F, decltype((_val_))>>.
Constraints: is_constructible_v<E, decltype(error())> is true.
Mandates: U is a specialization of expected andis_same_v<U::error_type, E> is true.
Effects: Equivalent to:if (has_value()) return invoke(std::forward<F>(f), val);else return U(unexpect, error());
template<class F> constexpr auto and_then(F&& f) &&;template<class F> constexpr auto and_then(F&& f) const &&;
Let U beremove_cvref_t<invoke_result_t<F, decltype(std::move(_val_))>>.
Constraints: is_constructible_v<E, decltype(std::move(error()))> is true.
Mandates: U is a specialization of expected andis_same_v<U::error_type, E> is true.
Effects: Equivalent to:if (has_value()) return invoke(std::forward<F>(f), std::move(val));else return U(unexpect, std::move(error()));
template<class F> constexpr auto or_else(F&& f) &;template<class F> constexpr auto or_else(F&& f) const &;
Let G be remove_cvref_t<invoke_result_t<F, decltype(error())>>.
Constraints: is_constructible_v<T, decltype((_val_))> is true.
Mandates: G is a specialization of expected andis_same_v<G::value_type, T> is true.
Effects: Equivalent to:if (has_value()) return G(in_place, val);else return invoke(std::forward<F>(f), error());
template<class F> constexpr auto or_else(F&& f) &&;template<class F> constexpr auto or_else(F&& f) const &&;
Let G beremove_cvref_t<invoke_result_t<F, decltype(std::move(error()))>>.
Constraints: is_constructible_v<T, decltype(std::move(_val_))> is true.
Mandates: G is a specialization of expected andis_same_v<G::value_type, T> is true.
Effects: Equivalent to:if (has_value()) return G(in_place, std::move(val));else return invoke(std::forward<F>(f), std::move(error()));
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((_val_))>>.
Constraints: is_constructible_v<E, decltype(error())> is true.
Mandates: U is a valid value type for expected.
If is_void_v<U> is false, the declarationU u(invoke(std::forward<F>(f), val));is well-formed.
Effects:
- If has_value() is false, returnsexpected<U, E>(unexpect, error()).
- Otherwise, if is_void_v<U> is false, returns anexpected<U, E> object whose has_val member is trueand val member is direct-non-list-initialized withinvoke(std::forward<F>(f), val).
- Otherwise, evaluates invoke(std::forward<F>(f), val) and then returns expected<U, E>().
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_))>>.
Constraints: is_constructible_v<E, decltype(std::move(error()))> is true.
Mandates: U is a valid value type for expected.
If is_void_v<U> isfalse, the declarationU u(invoke(std::forward<F>(f), std::move(val)));is well-formed.
Effects:
- If has_value() is false, returnsexpected<U, E>(unexpect, std::move(error())).
- Otherwise, if is_void_v<U> is false, returns anexpected<U, E> object whose has_val member is trueand val member is direct-non-list-initialized withinvoke(std::forward<F>(f), std::move(val)).
- Otherwise, evaluates invoke(std::forward<F>(f), std::move(val)) and then returns expected<U, E>().
template<class F> constexpr auto transform_error(F&& f) &;template<class F> constexpr auto transform_error(F&& f) const &;
Let G be remove_cv_t<invoke_result_t<F, decltype(error())>>.
Constraints: is_constructible_v<T, decltype((_val_))> is true.
Mandates: G is a valid template argument for unexpected ([expected.un.general]) and the declarationG g(invoke(std::forward<F>(f), error()));is well-formed.
Returns: If has_value() is true,expected<T, G>(in_place, val); otherwise, an expected<T, G>object whose has_val member is false and unex member is direct-non-list-initialized with invoke(std::forward<F>(f), error()).
template<class F> constexpr auto transform_error(F&& f) &&;template<class F> constexpr auto transform_error(F&& f) const &&;
Let G beremove_cv_t<invoke_result_t<F, decltype(std::move(error()))>>.
Constraints: is_constructible_v<T, decltype(std::move(_val_))> is true.
Mandates: G is a valid template argument for unexpected ([expected.un.general]) and the declarationG g(invoke(std::forward<F>(f), std::move(error())));is well-formed.
Returns: If has_value() is true,expected<T, G>(in_place, std::move(val)); otherwise, anexpected<T, G> object whose has_val member is falseand unex member is direct-non-list-initialized withinvoke(std::forward<F>(f), std::move(error())).