Работая с concept из C++ 20, я заметил, что std::unique_ptr не соответствует концепции std::equality_comparable_with<std::nullptr_t,...>. Из определения std::unique_ptr предполагается, что в 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;
Это требование должен реализует симметричное сравнение с nullptr - что, как я понимаю, достаточно для удовлетворения equality_comparable_with.
Любопытно, что эта проблема характерна для всех основных компиляторов. Следующий код отклонен из Clang, GCC и MSVC:
// fails on all three compilers
static_assert(std::equality_comparable_with<std::unique_ptr<int>,std::nullptr_t>);
Однако принято то же утверждение с std::shared_ptr:
// succeeds on all three compilers
static_assert(std::equality_comparable_with<std::shared_ptr<int>,std::nullptr_t>);
Если я чего-то не понимаю, похоже, это ошибка. Мой вопрос в том, является ли это случайной ошибкой в трех реализациях компилятора или это дефект в стандарте C++ 20?
Примечание: Я помечаю этот языковед на случай, если это дефект.





"что, по моему мнению, достаточно для удовлетворения
equality_comparable_with." Нет, но я не вижу других требований, которые не выполняются.