在rvalue对象上调用getter方法时获取rvalue

时间:2014-07-23 15:33:23

标签: c++ move-semantics rvalue-reference

假设我有以下代码。 B中有一个复制构造函数,它调用一个复制a的资源的方法。

现在我还有一个移动构造函数。在这种情况下,不应该复制a,而只是“窃取”现有资源中的资源。因此,我还实现了一个使用右值的init。但是当然,当我尝试用参数b.a调用它时,这是一个左值...

有没有办法调用此方法?

class A{

    A(const A&& a){
        // 'steal' resources from a
    }

    void init(A& a){
       // init this A from another A by copying its resources
    }

    void init(A&& a){
      // init this A from another A stealing its resources and tell the other a, it must not destroy resources upon destruction
    }
};

class B{
    A a;

    B(B& b){
      a.init(b.a)          
    }

    B(B&& b){
      a.init(b.a); // How to call init(A&& a)?  
    }

};

1 个答案:

答案 0 :(得分:7)

b.a是左值,因此您需要应用std::move

a.init(std::move(b.a));

注意但为什么bB(B&& b)正文中的左值?

这里,参数类型B&& b只是意味着当使用rvalue调用时,将选择此构造函数重载,例如B(const B& b)

B make_B() { return B(); }
B b1(make_B());            // B(B&&) chosen
B b2(b);                   // B(const B&) chosen

但参数本身是左值,因为它有一个名称。所有std::move所做的就是使其参数看起来像一个右值。