You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 12:22:43