Why is unique_ptr not equality_comparable_with nullptr_t in C++20?
Working with C++20's concept
s I noticed that std::unique_ptr
appears to fail to satisfy the std::equality_comparable_with<std::nullptr_t,...>
concept. From std::unique_ptr
's definition, it is supposed to implement the following when in C++20:
template<class T1, class D1, class T2, class D2>
bool operator==(const unique_ptr<T1, D1>& x, const unique_ptr<T2, D2>& y);
template <class T, class D>
bool operator==(const unique_ptr<T, D>& x, std::nullptr_t) noexcept;
This requirement should implement symmetric comparison with nullptr
-- which from my understanding is sufficient for satisfying equality_comparable_with
.
Curiously, this issue appears to be consistent on all the major compilers. The following code is rejected from Clang, GCC, and MSVC:
// fails on all three compilers
static_assert(std::equality_comparable_with<std::unique_ptr<int>,std::nullptr_t>);
Try Online
However the same assertion with std::shared_ptr
is accepted:
// succeeds on all three compilers
static_assert(std::equality_comparable_with<std::shared_ptr<int>,std::nullptr_t>);
Try Online
Unless I'm misunderstanding something, this appears to be a bug. My question is whether this is a coincidental bug in the three compiler implementations, or is this a defect in the C++20 standard?
Note: I'm tagging this language-lawyer in case this happens to be a defect.
equality_comparable_with
." It is not, but I don't see any other requirements that aren't satisfied. – Nicol Bolas Apr 4 at 4:29