措辞:b / w rvalue和rvalue引用有区别吗?

时间:2014-05-11 23:28:22

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

说我有以下对象

class foo
{
   foo() {..}                //Constructor 
   foo(const foo& f) {..}    //Copy Constructor - `f` is lvalue reference
   foo(foo&& g) {...}        //Move constructor 
};

现在我在声明

中知道了
 foo(const foo& f) {..} 

f是左值参考

现在我的问题是,在声明中

foo(foo&& g) {...}

我知道g是一个右值,但我已经听过并在这里读过,人们将g称为右值参考。我的问题是rvalue和rvalue参考之间的区别是什么?它们可以互换使用吗?

1 个答案:

答案 0 :(得分:2)

他们是不同的。

在C ++ 11中,有三类值:左值,x值(" eXpiring"值)和prvalues("纯" rvalues)。 C ++ 11中的rvalues由xvalues和prvalues组成。

左值是一个表达式,用于标识非临时对象或非成员函数。值得注意的是,即使x是右值引用,表达式x也是左值。从本质上讲,如果它是一个带名字的东西,它就是一个左值。

xvalue是一个表达式,用于标识过期的对象(可以从中移动)。这包括std::move(x)之类的内容,因为它返回右值引用,或static_cast<X&&>(x)

prvalue标识临时对象或与任何对象无关的值;这与rvalues pre-C ++ 11相同。

右值参考仅绑定到右值。因此,在

foo(foo&& f) {...}

f是绑定到右值(xvalue或prvalue)的右值引用,但表达式f本身是左值。它有一个名字,您可以使用&f获取其地址。右值引用的关键是对象f绑定的是一个右值,因此可以安全地从中移动。