我有以下基本代码:
struct X {
X(const char* descr) {...}
~X() {...} // Not virtual
virtual void foo() const {...}
};
struct Y : public X {
Y(const char* descr) {...}
~Y() {...} // Not virtual
virtual void foo() const {...}
};
const X& factory() {
static X sampleX{"staticX"};
static Y sampleY{"staticY"};
return X or Y depending of the test case;
};
和4个测试用例:
只是Y
= 好的
const X& var = Y{"temporaryY"};
var.foo();
结果:
X::X() // base temporaryY
Y::Y() // temporaryY
Y::foo()
Y::~Y() // temporaryY
X::~X() // base temporaryY
只是X
= 好的
const X& var = X{"temporaryX"};
var.foo();
结果:
X::X() // temporaryX
X::foo()
X::~X() // temporaryX
Y
或X
通过函数= OK
const X& var = factory();
var.foo();
结果:
X::X() // staticX
X::X() // base staticY
Y::Y() // staticY
X::foo() or Y::foo()
Y::~Y() // staticY
X::~X() // base staticY
X::~X() // staticX
Y
或X
通过三元运算符= WTF?!
const X& var = false ? X{"temporaryX"} : Y{"temporaryY"};
var.foo();
结果:
X::X() // base temporaryY
Y::Y() // temporaryY
Y::~Y() // temporaryY
X::~X() // base temporaryY
X::foo()
X::~X() // base temporaryY
有人可以解释一下为什么七地狱:
Y
在作用域结束之前调用析构函数?X::foo()
被称为而不是Y::foo()
?- 的析构
X
函数运行两次?