破坏右值参考

时间:2014-05-07 13:23:02

标签: c++ c++11 destructor rvalue-reference

我正在尝试学习如何使用右值参考。谁能解释为什么以下代码有效?当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();
}

1 个答案:

答案 0 :(得分:4)

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

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