C++20下std::variant::operator<触发隐式bool转换的异常问题
C++20中std::variant::operator<的意外行为
在MSVC 19.38编译器的C++20环境下,使用std::variant::operator<时会出现意外行为:当自定义类型存在隐式bool转换运算符,且其小于运算符为非成员函数时,会错误调用隐式bool转换,而非预期的自定义小于运算符。
代码示例
#include <variant> struct Foo { int x; int y; #ifndef DROP_CAST_OP constexpr operator bool() const { return x || y; } #endif #ifdef USE_SPACESHIP constexpr auto operator<=>(const Foo&) const noexcept = default; #else friend constexpr bool operator<(const Foo& a, const Foo& b) noexcept { return a.x < b.x || (a.x == b.x && a.y < b.y); } #endif }; using TestVariant = std::variant<Foo, int>; constexpr Foo fooA { 0, 1 }; constexpr Foo fooB { 1, 0 }; constexpr std::variant<Foo, int> varA = fooA; constexpr std::variant<Foo, int> varB = fooB; static_assert(fooA < fooB); static_assert(varA < varB);
解决方式(满足任一条件即可通过断言)
- 改用C++17标准
- 使用三路比较运算符(
operator<=>)替代非成员小于运算符 - 不定义隐式bool转换运算符
- 将bool转换运算符标记为
explicit
注:该行为在所有编译器中均存在。
内容的提问来源于stack exchange,提问作者Plog
相关产品推荐
相关产品推荐

