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 '&' 需要左值)