Widget&& rhs 是左值还是右值引用[重复]

Posted

技术标签:

【中文标题】Widget&& rhs 是左值还是右值引用[重复]【英文标题】:Is Widget&& rhs an lvalue or an rvalue reference [duplicate] 【发布时间】:2020-01-15 11:58:03 【问题描述】:

在有效的现代 C++ 中

class Widget 
public:
 Widget(Widget&& rhs); // rhs is an lvalue, though it has
 …                    // an rvalue reference type
;

rhs 是一个左值

void f(Widget&& param); // rvalue reference

param 是一个右值引用

rhs 和 param 有什么区别?

【问题讨论】:

rhs 是构造函数内部的右值。这意味着如果要将rhs用作右值引用,则应在函数内部使用std::move(),否则将被解释为左值引用。 @Ladence 这不准确,尽管结果是正确的 关于 dup:问题不一样接受的答案提供了这个问题的答案:没有区别。 【参考方案1】:

类型:在这两种情况下,参数的类型都是“对 Widget 的右值引用”。

值类别:在这两种情况下,参数的名称都是左值表达式。

没有区别。

延伸阅读:Rvalue Reference is Treated as an Lvalue?

【讨论】:

如果你是一个类型,你的sizeof 会返回什么 @SombreroChicken sizeof(your mum) 知道了,它们是对 Widget 的右值引用。它们可以被赋值,所以它们也是左值 @fizzbuzz 我听说过几次“可以分配给,所以它们也是左值”,而且不太准确。这些是左值,因为它们是左值。它们是引用对象的名称,并且几乎总是一个左值,因为语言规则是这样说的。右值通常没有名称,例如std::move() 的结果。左值/右值与你拥有的 表达式 类型有关,而不是你拥有的对象类型。

以上是关于Widget&& rhs 是左值还是右值引用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C++(E0158 表达式必须是左值或函数指示符)和(错误 C2102 '&' 需要左值)

error C2662 无法将左值绑定到右值 —— 变量永远是左值,即使它的类型为右值引用

是* p是左值还是左值

指针是左值还是右值?

& 返回左值或右值是啥?

左值与右值引用 详解