diff --git a/include/boost/system/result.hpp b/include/boost/system/result.hpp index 29bb4e3..86fd638 100644 --- a/include/boost/system/result.hpp +++ b/include/boost/system/result.hpp @@ -1209,6 +1209,22 @@ result& operator&=( result& r, F&& f ) return r; } +template()() ), + class En1 = typename std::enable_if::value>::type, + class En2 = typename std::enable_if::value>::type, + class En3 = typename std::enable_if::value>::type +> +result& operator&=( result& r, F&& f ) +{ + if( r ) + { + r = std::forward( f )(); + } + + return r; +} + } // namespace system } // namespace boost diff --git a/test/result_and_eq_fn1r.cpp b/test/result_and_eq_fn1r.cpp index c9519d7..703e4dc 100644 --- a/test/result_and_eq_fn1r.cpp +++ b/test/result_and_eq_fn1r.cpp @@ -80,6 +80,16 @@ result fri2( int& ) return E2(); } +result fv() +{ + return {}; +} + +result fv2() +{ + return E2(); +} + int main() { { @@ -122,5 +132,18 @@ int main() BOOST_TEST( r.has_error() ); } + { + result r; + + r &= fv; + BOOST_TEST( r.has_value() ); + + r &= fv2; + BOOST_TEST( r.has_error() ); + + r &= fv; + BOOST_TEST( r.has_error() ); + } + return boost::report_errors(); }