Рассмотрим этот фрагмент кода:
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: bar;
Для этого нужно скомпилировать код:
Base* obj = !bar ? static_cast<Base*>(foo) : bar;
Поскольку существует неявный приведение к Base*
, что мешает компилятору сделать это?
Другими словами, почему Base* obj = foo;
работать без броска, но с помощью ?:
оператор не делает? Это потому, что не ясно, что я хочу использовать Base
часть?