我是 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() 被认为是右值?
提前致谢。
最佳答案
为了回答标题问题,“右值引用”是一种类型,而“xvalue”是一种表达式。
rvalue references are considered lvalue (this part I understand)
他们不是。右值引用是类型,类型不是表达式,因此不能“视为左值”。您所指的是这样一个事实:如果表达式仅由 T&&
类型的变量名称组成,那么它是 T
类型的左值表达式.
why calling funcB() which return rvalue reference is considered rvalue
最直接的答案是“根据定义”。函数调用表达式,其中函数的返回类型为 T&&
是 T
类型的 xvalue 表达式。至于动机,这正是 std::move
的原因。做它所做的事情:赋予任何表达式移动的能力(也称为“右值类别” - 请参阅 http://en.cppreference.com/w/cpp/language/value_category )。
关于c++ - 右值引用和x值有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36557310/