默认三路比较运算符为何生成超出预期的冗余代码?
关于默认生成的三路比较运算符与基类比较行为的疑问
先看这段代码:
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
相关产品推荐
相关产品推荐

