Ссылочная переменная foo
ниже инициализируется либо экземпляром Foo
, либо его производным классом Bar
на основе condition
. Как ни странно, основываясь на результатах метода say()
, foo
представляется экземпляром Foo
, а не экземпляром Bar
- почему?
#include <iostream>
class Foo {
public:
virtual void say() const {
std::cout << "Foo\n";
}
};
class Bar : public Foo {
public:
virtual void say() const {
std::cout << "Bar\n";
}
};
int main() {
constexpr bool condition = false;
const Foo& foo = condition ? Foo() : Bar();
foo.say(); // outputs "Foo” ???
return 0;
}
Если я аннотирую каждый конструктор, я вижу, что конструктор Bar
вызывается при вычислении троичного выражения. Если я аннотирую каждый деструктор, я вижу, что деструктор Bar
вызывается до инициализации foo
- это говорит мне, что временный объект Bar
создается троичным оператором, но уничтожается до инициализации - почему?
Скомпилировано с (Apple LLVM версия 9.0.0 (clang-900.0.39.2))
clang++ -Wall -std=c++11 foo.cpp -o foo