You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

C++中含两个可转换为算术/指针类型类的条件运算符(?:)是否合法?

关于C++条件运算符中类类型转换的标准依据

嘿,这个问题抓得特别准!你提到的点其实涉及C++标准中条件表达式(?:)针对类类型的扩展规则,可能你之前只关注了算术/指针类型的直接条款,没挖到类类型相关的细节。

首先,咱们回到C++标准的**[expr.cond]**章节(条件表达式的核心规则),除了你找到的“两个操作数均为算术/指针类型、或可互相隐式转换”的情况,还有专门针对类类型的处理逻辑:

当条件表达式的两个操作数类型不同,且至少其中一个是类类型时,编译器会优先尝试将其中一个操作数隐式转换为另一个的类型;如果这种转换双向都不可行,或者双向都可行(出现歧义),则会尝试将两者转换为一个公共目标类型——这个目标类型可以是算术类型或指针类型,只要两个操作数都能通过「标准转换+用户定义转换」的序列转换到该类型。

换句话说,如果你定义的类重载了operator arithmetic-type()或者operator pointer-type()这类转换运算符,那么在条件表达式中,编译器会自动把这个类对象转换为对应的算术/指针类型,再参与公共类型的推导。

举个直观的例子(对应你提到的可编译代码场景):

struct IntLike {
    operator int() const { return 1; }
};

struct LongLike {
    operator long() const { return 2; }
};

int main() {
    auto result = true ? IntLike() : LongLike(); // 编译通过
}

这里IntLike能转intLongLike能转long,而intlong同属算术类型,编译器会把它们统一转换为更宽的long类型,所以表达式合法。

你之前没找到相关内容,大概率是因为这部分规则嵌套在类类型的转换逻辑里,不是单独和算术/指针类型的规则放在一起。g和clang都是严格遵循这个标准规则实现的,所以这类代码能正常编译。

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

火山引擎 最新活动