Тип 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
, который имеет все шесть сравнений, является лучшим выбором?