From 5ab7c24950cc6c3a94db6d0d7cff26210de80fb4 Mon Sep 17 00:00:00 2001 From: Steve Downey Date: Wed, 26 Nov 2025 18:36:12 -0500 Subject: [PATCH] Put constraints on `or_else` overloads Per spec, Constraints on or_else, but not on transform or and_then. --- include/beman/optional/optional.hpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) 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()) {