我正在尝试学习如何使用右值参考。谁能解释为什么以下代码有效?当D
的构造函数超出范围时,为什么从B
的初始化列表发送到A
的构造函数的B
没有被破坏? / p>
class C {
public:
void test() {
std::cout << i << " ok!\n";
}
private:
int i = rand();
};
class D: public C {};
class A {
public:
A(C &&c) : m_c(c) {}
void test() {m_c.test();}
private:
C &m_c;
};
class B: public A {
public:
B() : A(D()) {}
};
int main(int argc, char** argv) {
A *a = new B();
a->test();
}
答案 0 :(得分:4)
正在销毁临时D
,并且通过调用其生命周期已结束的对象的方法,您有未定义的行为。
当你有未定义的行为时,正常工作是一种可能的行为。