[libcxx-commits] [libcxx] [llvm] [libc++] Implement P3379R0 Constrain `std::expected` equality operators (PR #135759)
A. Jiang via libcxx-commits
libcxx-commits at lists.llvm.org
Sun May 4 01:17:57 PDT 2025
================
@@ -1139,8 +1140,15 @@ class expected : private __expected_base<_Tp, _Err> {
// [expected.object.eq], equality operators
template <class _T2, class _E2>
+ _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const expected<_T2, _E2>& __y)
requires(!is_void_v<_T2>)
- _LIBCPP_HIDE_FROM_ABI friend constexpr bool operator==(const expected& __x, const expected<_T2, _E2>& __y) {
+# if _LIBCPP_STD_VER >= 26
+ && requires {
+ { *__x == *__y } -> __core_convertible_to<bool>;
----------------
frederick-vs-ja wrote:
Ah, even when there's no issue with explicit conversion, the prvalue VS xvalue problem still blocks use of `convertible_to`. [Godbolt link](https://godbolt.org/z/jdn671MGn).
```C++
#include <type_traits>
#include <concepts>
struct Y {
Y() = default;
Y(const Y&) = delete;
Y& operator=(const Y&) = delete;
constexpr operator bool(this Y) { return true; }
};
static_assert(!std::is_convertible_v<Y, bool>);
static_assert(!std::convertible_to<Y, bool>);
constexpr bool b1 = Y{};
constexpr bool b2(Y{});
```
https://github.com/llvm/llvm-project/pull/135759
More information about the libcxx-commits
mailing list