| 3726 | class Ret = decltype(detail::invoke(std::declval<F>(), |
| 3727 | *std::declval<Exp>()))> |
| 3728 | constexpr auto and_then_impl(Exp &&exp, F &&f) { |
| 3729 | static_assert(detail::is_expected<Ret>::value, "F must return an expected"); |
| 3730 | |
| 3731 | return exp.has_value() |
| 3732 | ? detail::invoke(std::forward<F>(f), *std::forward<Exp>(exp)) |
| 3733 | : Ret(unexpect, std::forward<Exp>(exp).error()); |
| 3734 | } |
| 3735 | |
| 3736 | template <class Exp, class F, |
| 3737 | detail::enable_if_t<std::is_void<exp_t<Exp>>::value> * = nullptr, |