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

C++23带显式对象参数的默认比较运算符有效性问询

C++23显式对象成员默认比较运算符的合法性问题

核心问题梳理

C++23引入了显式对象成员函数:类的非静态成员函数可以将this作为首个参数显式声明,这类函数也支持比较运算符,指定=default后编译器会自动生成对应逻辑。但将原本合法的友元默认比较运算符替换为this首参数形式时,不同编译器表现不一致:

  • 示例1:友元版本被所有编译器接受,#1版本(替换friend为this)仅GCC支持,Clang报错
  • 示例2:友元版本全编译器失败,#2版本被Clang支持、GCC报错

同时明确:显式对象成员比较运算符指定=default后,编译器可自动生成的运算符包括==、!=、<、<=、>、>=以及三路比较运算符<=>,默认逻辑为逐成员比较,和传统默认比较行为一致。

两种写法的合法性判定

#1写法(友元转this参数)

友元默认比较运算符是独立的非成员函数,而显式对象成员函数属于类的非静态成员函数范畴,不能用friend关键字声明。#1写法本质混淆了友元函数和显式对象成员函数的定义规则,不符合C++23标准。GCC的支持属于非标准扩展,Clang的报错是符合标准的正确行为。

#2写法(标准显式对象成员运算符)

如果#2写法是**无friend修饰、作为类非静态成员、首参数为this**的合法显式对象成员比较运算符声明,那么它是符合C23标准的。示例2中友元版本失败,说明友元版本本身签名或声明规则错误;GCC的报错属于编译器对C23该特性的实现不完善,Clang的支持是符合标准的。

最终结论

只有#2写法(符合非静态成员函数规则、正确使用this作为首参数、无friend修饰)是C++23标准合法的写法;#1写法违反了显式对象成员函数的定义规则,属于不合法写法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:52:39