diff --git a/include/nonstd/expected.hpp b/include/nonstd/expected.hpp index fdfb432..0217b9b 100644 --- a/include/nonstd/expected.hpp +++ b/include/nonstd/expected.hpp @@ -2165,7 +2165,11 @@ class expected // x.x.4.6 expected<>: comparison operators -template< typename T1, typename E1, typename T2, typename E2 > +template< typename T1, typename E1, typename T2, typename E2 + nsel_REQUIRES_T( + !std::is_void::value && !std::is_void::value + ) +> constexpr bool operator==( expected const & x, expected const & y ) { return bool(x) != bool(y) ? false : bool(x) == false ? x.error() == y.error() : *x == *y; @@ -2213,13 +2217,21 @@ constexpr bool operator>=( expected const & x, expected const & y ) // x.x.4.7 expected: comparison with T -template< typename T1, typename E1, typename T2 > +template< typename T1, typename E1, typename T2 + nsel_REQUIRES_T( + !std::is_void::value + ) +> constexpr bool operator==( expected const & x, T2 const & v ) { return bool(x) ? *x == v : false; } -template< typename T1, typename E1, typename T2 > +template< typename T1, typename E1, typename T2 + nsel_REQUIRES_T( + !std::is_void::value + ) +> constexpr bool operator==(T2 const & v, expected const & x ) { return bool(x) ? v == *x : false; diff --git a/test/expected.t.cpp b/test/expected.t.cpp index 2f70046..fe43e25 100644 --- a/test/expected.t.cpp +++ b/test/expected.t.cpp @@ -1838,6 +1838,24 @@ nonstd::unexpected_type create_nonmoveable() } // namespace issue_50 +namespace issue_51 { + +int compare_equal_with_expected_void() +{ + auto ev1 = nonstd::expected{}; + auto ev2 = nonstd::expected{}; + return ev1 == ev2; +} + +int compare_not_equal_with_expected_void() +{ + auto ev1 = nonstd::expected{}; + auto ev2 = nonstd::expected{}; + return ev1 != ev2; +} + +} // namespace issue_51 + // ----------------------------------------------------------------------- // using as optional