rvalue reference和xvalue有什么区别?

时间:2016-04-11 19:14:14

标签: c++ lvalue rvalue

我是C ++的新手,这是我在这里的第一个问题所以请耐心等待...我已经阅读了一段时间左右的左值和右值我认为我理解其中的大部分内容但是有点令人困惑我...所以我的问题将是具体的

rvalue引用被认为是左值(我理解这一部分)但返回rvalue引用的函数被视为rvalue(或xvalue具体),例如:

int x = 32;
int& Lref = x; // Lref is lvalue ... ok
int& funcA(); // calling funcA() is lvalue ... ok 

int&& Rref = 32; // Rref is lvalue ... ok I got this
int&& funcB(); // calling funcB() is rvalue ... Why?

所以问题是:为什么调用返回rvalue引用的funcB()被认为是rvalue?

提前致谢。

2 个答案:

答案 0 :(得分:3)

要回答这个名词问题,“右值参考”是一种类型,而“xvalue”是一种表达。

  

右值参考被认为是左值(我理解这部分)

他们不是。 Rvalue引用是类型,类型不是表达式,因此不能被视为“左值”。你所指的是如果一个表达式只包含T&&类型变量的名称,那么它就是T类型的左值表达式。

  

为什么调用返回rvalue引用的funcB()被认为是rvalue

最直截了当的答案是“按照定义”。函数的返回类型为T&&的函数调用表达式是类型T的xvalue表达式。至于动机,这正是std::move做它所做的事情:让任何表达都能够被移动(也称为“右值类别” - 见http://en.cppreference.com/w/cpp/language/value_category)。

答案 1 :(得分:1)

一般来说,"对象"函数返回的函数在与函数本身关联的堆栈部分上创建。也就是说,返回的值必须被复制(或移动)到一个新对象,并且该对象是一个右值。

在你的代码中,你为lref做了一个错误。 32是右值参考。

简单来说,左值引用是我们可以获取地址的对象。我们无法获得右值参考的地址。

int a = 50;
int &b = a; // Ok because we can get the address of a
int &c = 50; // Error we can't get the address of 50
int &&d = 50; // It is ok

它与"对象"。

同样适用

例如,使用不可复制的unique_ptr代码。

std::unique_ptr<int> foo() {
    auto ptr = std::make_unique<int>(5);
    return ptr;
}
auto a = foo(); // is correct, the ptr will be moved because it is a rvalue

此函数必须返回一个正确的右值。 (通常情况下,编译器在您没有指定左值或右值是否使用右值引用时)。

也许你可以看看: http://en.cppreference.com/w/cpp/language/value_category

如果不清楚,请告诉我