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

默认三路比较运算符为何生成超出预期的冗余代码?

关于默认生成的三路比较运算符与基类比较行为的疑问

先看这段代码:

struct B {
    friend bool operator< (const B&, const B&);
    friend bool operator==(const B&, const B&);
};

struct D : B {
    friend std::strong_ordering operator<=>(const D&, const D&) = default;
};

bool less(const D& a, const D& b) {
    return a < b;
}

这里的operator<和operator==被故意留空未定义,用来规避内联相关的优化。查看GCC生成的汇编后发现,less()函数的实际执行逻辑等价于:

bool less(const D& a, const D& b) {
    if (static_cast<const B&>(a) == static_cast<const B&>(b))
        return false;
    else
        return static_cast<const B&>(a) < static_cast<const B&>(b);
}

但我原本预期的实现是这样的:

bool less(const D& a, const D& b) {
    return static_cast<const B&>(a) < static_cast<const B&>(b);
}

想请教:编译器为什么要额外调用operator==(const B&, const B&),而不是只调用operator<(const B&, const B&)?这是编译器的优化缺失,还是存在必须检查相等性的底层原因?


内容的提问来源于stack exchange,提问作者Evg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 09:10:12