C++ 如果传递函数,右值引用是否优化?

C++ 如果传递函数,右值引用是否优化?,c++,c++11,pass-by-reference,rvalue-reference,C++,C++11,Pass By Reference,Rvalue Reference,我有[简化]代码: class AClass{ public: AClass( BigClass && bc ) : m_bc{std::move(bc)} {} private: BigClass m_bc; }; AClass * aFunction( BigClass && bc ){ return new AClass( std::move(bc) ); } 它起作用了。但这是正确的吗?BigClass数据是沿着调用移动而不创

我有[简化]代码:

class AClass{
public:
    AClass( BigClass && bc ) : m_bc{std::move(bc)} {}

private:
    BigClass m_bc;
};

AClass * aFunction( BigClass && bc ){
    return new AClass( std::move(bc) );
}

它起作用了。但这是正确的吗?BigClass数据是沿着调用移动而不创建临时对象?

是的,您的数据是正确的。您需要使用
std::move
,否则代码将无法编译。原因可能还不清楚。如果我们这样调用函数:

AClass *a = aFunction(BigClass{});
a函数
用右值调用,右值是
BigClass
的默认构造函数的返回值。但是在
a函数
中,变量
bc
是一个左值。记住,如果它有一个名字,它就是一个左值。为了使用
AClass
的move构造函数,我们必须将
bc
转换为带有
std::move
的右值

为了更清楚地了解这一点,让我们向
AClass
添加一些打印输出(和一个复制构造函数):

AClass( BigClass & bc ) : m_bc{bc} { std::cout << "Copy\n"; }
AClass( BigClass && bc ) : m_bc{std::move(bc)} { std::cout << "Move\n"; }

AClass(BigClass&bc):m_bc{bc}{std::cout我不确定,我不知道我是否应该在
afuction
中使用std::forward,但它失败了。std::forward用于模板。std::move
所做的只是将左值更改为右值。它实际上不做任何移动。
std::forward
是for,这与右值引用有细微的不同。谢谢,我想是这样的关键是“如果它有名字,它就是左值”短语:)