c++ - 右值引用和x值有什么区别?

标签 c++ lvalue rvalue

我是 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/

相关文章:

c++ - 可以传递匿名变量的地址吗?

c++ - 从类型 'int&' 的临时类型 'int' 的非常量引用的无效初始化

c++ - 可以推断左值引用非类型模板参数吗?

c++ - 为什么传递右值引用 (X&&) 就像传递左值引用 (X&)?

C++异常处理错误输出

c++ - 高效获取 std::*_heap 的第二个元素

c++ - 为什么我在构建结构时在 Visual C++ 2008 中收到这些警告?

c++ - "Cannot handle hot-plugged CPUs"- 执行问题

c++ - 为什么 const 临时绑定(bind)到右值引用参数?

c++ - 如何在 C++ 中同时转换右值和左值参数?