右值引用和 xvalue 有什么区别?

What is the difference between rvalue reference and xvalue?

我是 C++ 的新手,这是我的第一个问题,所以请多多包涵...我已经阅读左值和右值有一段时间了,我想我了解其中的大部分内容,但有一点仍然让我感到困惑......所以我的问题将是具体的

右值引用被认为是左值(这部分我理解)但是 return 右值引用被认为是右值(或特定的 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?

所以问题是:为什么调用 return 右值引用被认为是右值的 funcB()?

提前致谢。

一般来说,"object" return由一个函数创建的是在与函数本身关联的堆栈部分上创建的。也就是说,必须将值 returned 复制(或移动)到一个新对象,而这个对象是一个右值。

在你的代码中,你对 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

它也适用于 "object"。

以不可复制的 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

此函数必须 return 右值才是正确的。 (通常情况下,当您不指定它是左值还是右值时,编译器将使用右值引用)。

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

如果不清楚,请告诉我

回答标题问题,"rvalue reference"是一种类型,而"xvalue"是一种表达式。

rvalue references are considered lvalue (this part I understand)

他们不是。右值引用是类型,类型不是表达式,因此不能是 "considered lvalue"。您指的是这样一个事实,即如果表达式仅由 T&& 类型的变量名称组成,那么它是 T.

类型的左值表达式

why calling funcB() which return rvalue reference is considered rvalue

最直接的答案是 "by definition"。函数的 return 类型为 T&& 的函数调用表达式是类型 T 的 xvalue 表达式。至于动机,这正是让 std::move 做它所做的事情的原因:赋予任何表达式以移动的能力(也称为 "rvalue category" - 请参阅 http://en.cppreference.com/w/cpp/language/value_category)。