破坏右值引用

Destructing rvalue references

本文关键字:引用      更新时间:2023-10-16

我正在学习如何使用右值引用。谁能解释为什么下面的代码工作?为什么当B的构造函数超出作用域时,从B的初始化列表发送到A的构造函数的D没有被销毁?

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();
}

临时D正在被销毁,并且通过调用生命周期已经结束的对象的方法会产生未定义的行为。

当你有未定义的行为时,正常工作是一种可能的行为。