右值引用和xvalue之间的区别是什么

What is the difference between rvalue reference and xvalue?

本文关键字:区别 是什么 之间 xvalue 引用      更新时间:2023-10-16

我是C++的新手,这是我在这里的第一个问题,请耐心等待。。。我已经读了一段时间关于左值和右值的书,我想我理解其中的大部分内容,但仍有一些让我困惑。。。所以我的问题将是具体的

右值引用被认为是左值(我理解这一部分),但返回右值引用的函数被认为是右值(或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?

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

提前谢谢。

要回答有名无实的问题,"rvalue reference"是一种类型,而"xvalue"则是一种表达式。

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

事实并非如此。Rvalue引用是类型,类型不是表达式,因此不能被"视为左值"。您所指的是这样一个事实,即如果一个表达式仅由类型为T&&的变量的名称组成,那么它就是类型为T的左值表达式。

为什么调用返回右值引用的funcB()被视为右值

最直接的答案是"根据定义"。函数的返回类型为T&&的函数调用表达式是T类型的xvalue表达式。至于动机,这正是std::move做它所做的事情的原因:赋予任何表达从(也称为"右值类别")转移的能力-参见http://en.cppreference.com/w/cpp/language/value_category)。

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

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

如果不清楚,请告诉我