c++ - 基于 C++ 三元运算的基类

  显示原文与译文双语对照的内容
120 1

考虑下面的代码:


struct Base


{


 int x;


};



struct Bar : Base


{


 int y;


};



struct Foo : Base


{


 int z;


};



Bar* bar = new Bar;


Foo* foo = new Foo;



Base* returnBase()


{


 Base* obj =!bar? foo : bar;


 return obj;


}



int main() {


 returnBase();


 return 0;


}



这在Clang或者GCC下面不起作用,这给了我:

错误:不同指针类型'foo*'和'bar*'之间的条件表达式缺少强制转换 Base* = bar? ! 酒吧;

也就是说要编译,我必须将代码修改为:


Base* obj =!bar? static_cast<Base*>(foo) : bar;



由于存在 Base* 隐式转换,因此阻止编译器执行这里操作的是什么?

换句话说,为什么 Base* obj = foo; 不使用强制转换,但使用 ?: 运算符时不使用? 是因为我不清楚我是否想要使用 Base 部件?

时间: 原作者:

124 2

允许转换到条件运算符的基本指针类型听起来不错,但在实践中会有问题。

在你的示例中


struct Base {};


struct Foo : Base {};


struct Bar : Base {};



这似乎是一种显而易见的选择 cond? foo : bar 成为 Base*

但这种逻辑并不符合一般情况

比如:


struct TheRealBase {};


struct Base : TheRealBase {};


struct Foo : Base {};


struct Bar : Base {};



应该应 cond? foo : bar 类型为 Base* 或者类型为 TheRealBase*

怎么办:


struct Base1 {};


struct Base2 {};


struct Foo : Base1, Base2 {};


struct Bar : Base1, Base2 {};



什么类型应该 cond? foo : bar 立即?

或者现在呢:


struct Base {};



struct B1 : Base {};


struct B2 : Base {};



struct X {};



struct Foo : B1, X {};


struct Bar : B2, X {};



 Base


/


/


/


 B1 B2 


 | X |


 |/|


 |/|


 Foo Bar



哎哟祝你好运 ! cond? foo : bar 我知道,丑丑的丑,不实用和被追踪,但标准仍然必须有规则。

你知道。

还要记住 std::common_type 是按照条件运算符规则定义的。

原作者:
...