Files
2025-10-25 03:02:53 +03:00

10 KiB
Raw Permalink Blame History

[expected.object.monadic]

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 &;

1

#

Let U be remove_cvref_t<invoke_result_t<F, decltype((val))>>.

2

#

Constraints: is_constructible_v<E, decltype(error())> is true.

3

#

Mandates: U is a specialization of expected andis_same_v<U::error_type, E> is true.

4

#

Effects: Equivalent to:if (has_value())return invoke(std::forward(f), val);elsereturn U(unexpect, error());

🔗

template<class F> constexpr auto and_then(F&& f) &&; template<class F> constexpr auto and_then(F&& f) const &&;

5

#

Let U beremove_cvref_t<invoke_result_t<F, decltype(std::move(val))>>.

6

#

Constraints: is_constructible_v<E, decltype(std::move(error()))> is true.

7

#

Mandates: U is a specialization of expected andis_same_v<U::error_type, E> is true.

8

#

Effects: Equivalent to:if (has_value())return invoke(std::forward(f), std::move(val));elsereturn U(unexpect, std::move(error()));

🔗

template<class F> constexpr auto or_else(F&& f) &; template<class F> constexpr auto or_else(F&& f) const &;

9

#

Let G be remove_cvref_t<invoke_result_t<F, decltype(error())>>.

10

#

Constraints: is_constructible_v<T, decltype((val))> is true.

11

#

Mandates: G is a specialization of expected andis_same_v<G::value_type, T> is true.

12

#

Effects: Equivalent to:if (has_value())return G(in_place, val);elsereturn invoke(std::forward(f), error());

🔗

template<class F> constexpr auto or_else(F&& f) &&; template<class F> constexpr auto or_else(F&& f) const &&;

13

#

Let G beremove_cvref_t<invoke_result_t<F, decltype(std::move(error()))>>.

14

#

Constraints: is_constructible_v<T, decltype(std::move(val))> is true.

15

#

Mandates: G is a specialization of expected andis_same_v<G::value_type, T> is true.

16

#

Effects: Equivalent to:if (has_value())return G(in_place, std::move(val));elsereturn invoke(std::forward(f), std::move(error()));

🔗

template<class F> constexpr auto transform(F&& f) &; template<class F> constexpr auto transform(F&& f) const &;

17

#

Let U beremove_cv_t<invoke_result_t<F, decltype((val))>>.

18

#

Constraints: is_constructible_v<E, decltype(error())> is true.

19

#

Mandates: U is a valid value type for expected.

If is_void_v is false, the declarationU u(invoke(std::forward(f), val)); is well-formed.

20

#

Effects:

  • (20.1)

    If has_value() is false, returnsexpected<U, E>(unexpect, error()).

  • (20.2)

    Otherwise, if is_void_v is false, returns anexpected<U, E> object whose has_val member is true and val member is direct-non-list-initialized withinvoke(std::forward(f), val).

  • (20.3)

    Otherwise, evaluates invoke(std::forward(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 &&;

21

#

Let U beremove_cv_t<invoke_result_t<F, decltype(std::move(val))>>.

22

#

Constraints: is_constructible_v<E, decltype(std::move(error()))> is true.

23

#

Mandates: U is a valid value type for expected.

If is_void_v isfalse, the declarationU u(invoke(std::forward(f), std::move(val))); is well-formed.

24

#

Effects:

  • (24.1)

    If has_value() is false, returnsexpected<U, E>(unexpect, std::move(error())).

  • (24.2)

    Otherwise, if is_void_v is false, returns anexpected<U, E> object whose has_val member is true and val member is direct-non-list-initialized withinvoke(std::forward(f), std::move(val)).

  • (24.3)

    Otherwise, evaluates invoke(std::forward(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 &;

25

#

Let G be remove_cv_t<invoke_result_t<F, decltype(error())>>.

26

#

Constraints: is_constructible_v<T, decltype((val))> is true.

27

#

Mandates: G is a valid template argument for unexpected ([expected.un.general]) and the declarationG g(invoke(std::forward(f), error())); is well-formed.

28

#

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), error()).

🔗

template<class F> constexpr auto transform_error(F&& f) &&; template<class F> constexpr auto transform_error(F&& f) const &&;

29

#

Let G beremove_cv_t<invoke_result_t<F, decltype(std::move(error()))>>.

30

#

Constraints: is_constructible_v<T, decltype(std::move(val))> is true.

31

#

Mandates: G is a valid template argument for unexpected ([expected.un.general]) and the declarationG g(invoke(std::forward(f), std::move(error()))); is well-formed.

32

#

Returns: If has_value() is true,expected<T, G>(in_place, std::move(val)); otherwise, anexpected<T, G> object whose has_val member is false and unex member is direct-non-list-initialized withinvoke(std::forward(f), std::move(error())).