说我有以下对象
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参考之间的区别是什么?它们可以互换使用吗?
答案 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
绑定的是一个右值,因此可以安全地从中移动。