措辞:是否有差异b/w右值和右值引用

Wording : Is there a difference b/w rvalue and rvalue references?

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

假设我有以下对象

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称为右值引用。我的问题是右值和右值引用之间的区别是什么,或者它们可以互换使用?

它们不一样。

在c++ 11中有三种类型的值:左值,x值("过期"值)和右值("纯"右值)。c++ 11中的右值由左值和右值组成。

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

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

右值标识临时对象或与任何对象无关的值;

右值引用只绑定到右值。因此,在

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

f是绑定到右值(xvalue或右值)的右值引用,但表达式f本身是左值。它有名字,你可以用&f找到它的地址。右值引用的意义在于,f绑定的对象是一个右值,因此可以安全地从

中移动。