右值引用和 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)。
我是 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)。