Почему unique_ptr не является равенством_comparable_with nullptr_t в С ++ 20?

Работая с 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>);

Try Online

Однако принято то же утверждение с std::shared_ptr:

// succeeds on all three compilers
static_assert(std::equality_comparable_with<std::shared_ptr<int>,std::nullptr_t>);

Try Online

Если я чего-то не понимаю, похоже, это ошибка. Мой вопрос в том, является ли это случайной ошибкой в ​​трех реализациях компилятора или это дефект в стандарте C++ 20?

Примечание: Я помечаю этот на случай, если это дефект.

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

Nicol Bolas 04.04.2021 07:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
41
1
1 805
0

Другие вопросы по теме