条件运算符与派生/基类转内置类型的疑似编译器问题
C++条件表达式中转换运算符的标准合规性问题
原始编译报错示例
以下代码会触发编译错误:
struct X {}; struct Y : X {}; using CY = const Y; true ? X() : CY(); // 编译报错
添加转换运算符后的可编译版本
给类添加转换运算符后,代码可以正常编译:
struct X { operator int() { return 0; } }; struct Y : X { operator int() const { return 0; } }; using CY = const Y; true ? X() : CY(); // 编译通过,条件表达式生成int类型纯右值
相关C++标准条款
根据C++标准[expr.cond] p4.3.2条款规定:
否则,如果T2是T1的基类,则目标类型为cv1 T2,其中cv1表示T1的cv限定符;
按照该条款,CY()操作数应被转换为const X类型。而根据[expr.cond] p6条款,已转换为const X类型的操作数不应调用Y::operator int() const(存在对象切片问题)。但实际情况是,修改后的示例在所有主流编译器中都能编译通过。
问题:这种编译器行为是否符合C++标准?
内容的提问来源于stack exchange,提问作者Sneed Deens
相关产品推荐
相关产品推荐

