diff --git a/include/beman/optional/optional.hpp b/include/beman/optional/optional.hpp index b4b4666..f08b089 100644 --- a/include/beman/optional/optional.hpp +++ b/include/beman/optional/optional.hpp @@ -727,7 +727,8 @@ class optional { * @return optional */ template - constexpr optional or_else(F&& f) const&; + constexpr optional or_else(F&& f) const& + requires (std::invocable && std::copy_constructible); /** * @brief Returns an optional containing the contained value if it has one, or @@ -738,7 +739,8 @@ class optional { * @return auto */ template - constexpr optional or_else(F&& f) &&; + constexpr optional or_else(F&& f) && + requires (std::invocable && std::move_constructible); // \ref{optional.mod}, modifiers /** @@ -1231,7 +1233,9 @@ constexpr auto optional::transform(F&& f) const&& { */ template template -constexpr optional optional::or_else(F&& f) const& { +constexpr optional optional::or_else(F&& f) const& + requires (std::invocable && std::copy_constructible) +{ static_assert(std::is_same_v>, optional>); if (has_value()) return value_; @@ -1250,7 +1254,9 @@ constexpr optional optional::or_else(F&& f) const& { */ template template -constexpr optional optional::or_else(F&& f) && { +constexpr optional optional::or_else(F&& f) && + requires (std::invocable && std::move_constructible) +{ static_assert(std::is_same_v>, optional>); if (has_value()) return std::move(value_); @@ -1870,7 +1876,8 @@ class optional { * return an optional type. */ template - constexpr optional or_else(F&& f) const; + constexpr optional or_else(F&& f) const + requires (std::invocable); // \ref{optional.mod}, modifiers /** @@ -2078,7 +2085,10 @@ constexpr optional> optional::transform(F&& f) c */ template template -constexpr optional optional::or_else(F&& f) const { +constexpr optional optional::or_else(F&& f) const + + requires (std::invocable) +{ using U = std::invoke_result_t; static_assert(std::is_same_v, optional>, "Result must be an optional"); if (has_value()) {