自定义三路比较运算符导致std::ranges::stable_sort编译失败问题
自定义三路比较运算符导致
std::ranges::stable_sort编译失败的原因 核心差异
C++20中,自定义实现的三路比较运算符与默认生成版本的行为有本质区别:
- 当使用
= default声明operator<=>时,编译器会自动为类生成全套关系运算符(operator<、operator<=、operator>、operator>=)以及operator==。这些生成的运算符满足std::sortable概念要求,因此std::ranges::stable_sort能正常调用。 - 当你手动实现
operator<=>的函数体(非= default)时,编译器仅会自动生成operator==(未显式定义时),不会生成operator<等关系运算符。而std::ranges::stable_sort默认依赖std::ranges::less,后者需要调用operator<,此时因该运算符缺失导致编译失败。
关于A(1) < A(2)的误解
你提到的const bool x = A(1) < A(2)可编译的情况,仅在使用默认生成的operator<=>时成立。自定义operator<=>时,该表达式同样会因缺少operator<而编译失败,大概率是测试时混淆了两种代码版本。
解决方法
有两种可行方案:
- 显式定义
operator<,基于自定义的operator<=>实现:bool operator<(const A& rhs) const { return (*this <=> rhs) < 0; } - 保留默认生成的
operator<=>(如果类成员变量的默认比较逻辑符合业务需求)。
内容的提问来源于stack exchange,提问作者SebastianK
相关产品推荐
相关产品推荐

