std :: вариант сравнения с std :: nullptr_t внутри - PullRequest
2 голосов
/ 26 сентября 2019

Моя проблема может быть изложена в следующем коде

#include <variant>

int main()
{
    using V = std::variant<int, std::nullptr_t>;
    V a = 0;
    V b = nullptr;

    a < b;
}

Я хочу иметь вариант с std::nullptr_t внутри и хочу сравнить эти варианты.Он работал в Visual Studio 2018 (версия 16.1.X), но не будет компилироваться в версии 16.3.1.Я думал, что это ошибка в компиляторе, но я не уверен сейчас.Я не могу найти ничего о std::nullptr_t поддерживающих операторах сравнения, и даже GCC и Clang , похоже, не согласны.Должно ли это работать или нет?Кроме того, если нет правильного ответа, есть ли способ заставить его работать?Определение оператора для std::nullptr_t, похоже, не работает.

inline bool operator<(std::nullptr_t, std::nullptr_t)
{
    return false;
}

Так как определение реляционных операторов может быть сделано только по параметру класса.

Спасибо.

1 Ответ

5 голосов
/ 26 сентября 2019

Тип std::nullptr_t не имеет для него никаких реляционных операторов.Это только сравнимо по равенству (то есть nullptr == nullptr является действительным и true, но nullptr < nullptr является плохо сформированным).Вы можете утверждать, что это дефект, и мы могли бы определить реляционные операторы так, чтобы nullptr < nullptr было false, nullptr <= nullptr было true и т. Д. Но это так.

Использование < в variant<Ts...> требует, чтобы < была действительной операцией для каждого типа в Ts..., что не так в вашем примере, следовательно, a < b неверно сформирован.Это не ошибка ни в одном из компиляторов или библиотек, это ожидаемое поведение.

Единственный способ заставить < работать здесь - это предоставить типы, которые на самом деле имеют <, то есть обернуть std::nullptr_t в какой-то другой тип, который на самом деле упорядочен.Вам конкретно нужно std::nullptr_t?Может быть, std::monostate, который имеет все шесть сравнений, является лучшим выбором?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...