【发布时间】:2018-08-20 18:04:05
【问题描述】:
考虑这段代码:
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* obj = !bar ? foo : 酒吧;
这意味着它要编译我必须将代码更改为:
Base* obj = !bar ? static_cast<Base*>(foo) : bar;
由于存在对 Base* 的隐式强制转换,是什么阻止了编译器这样做?
换句话说,为什么Base* obj = foo; 在没有演员表的情况下可以工作,而使用?: 运算符却不行?是因为不清楚我要使用Base 部分吗?
【问题讨论】:
-
是时候让律师进来了。这是我今天的投票。
-
@IInspectable 我宁愿把它放在类而不是结构上,很有可能两者具有相同的行为但更安全。
-
@DrewDormann 我没有仔细阅读。从我看到的情况来看,我希望派生到基础的转换是允许的
-
两种类型都存在到
void*的隐式转换,但我们不希望这种转换真正触发,是吗?
标签: c++ language-lawyer c++17 ternary-operator implicit-conversion