diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index d0c8d4e..5cd6802 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -1192,7 +1192,8 @@ result operator&( result&& r, F&& f ) template()() ), - class En = typename std::enable_if::value>::type + class En1 = typename std::enable_if::value>::type, + class En2 = typename std::enable_if::value>::type > result operator&( result const& r, F&& f ) { @@ -1206,6 +1207,23 @@ result operator&( result const& r, F&& f ) } } +template()() ), + class En = typename std::enable_if::value>::type +> +result operator&( result const& r, F&& f ) +{ + if( r.has_error() ) + { + return r.error(); + } + else + { + std::forward( f )(); + return {}; + } +} + // result & unary-returning-result template r; + result r2 = r & fv2; + + BOOST_TEST( r2.has_value() ); + } + + { + result const r; + result r2 = r & fv2; + + BOOST_TEST( r2.has_value() ); + } + + { + result r2 = result() & fv2; + + BOOST_TEST( r2.has_value() ); + } + + { + result r( in_place_error ); + result r2 = r & fv2; + + BOOST_TEST( r2.has_error() ); + } + + { + result const r( in_place_error ); + result r2 = r & fv2; + + BOOST_TEST( r2.has_error() ); + } + + { + result r2 = result( in_place_error ) & fv2; + + BOOST_TEST( r2.has_error() ); + } + return boost::report_errors(); }