首页 > 解决方案 > 为什么命名右值引用是左值表达式?

问题描述

我知道命名引用是左值:

int x = 1;
int& ref1 = x;
int&& ref2 = std::move(x);

我已经阅读了解释——那是因为我们可以获取那些ref1ref2.

但是当我们获取引用的地址时,我们实际上获取了被引用对象的地址,不是吗?所以这个解释似乎并不正确。

那么为什么命名引用是左值呢?

标签: c++rvalue-referencevalue-categories

解决方案


根据[expr.prim.id.unqual](8.1.4.1 非限定名称):

[...] 如果实体是函数、变量或数据成员,则表达式为左值,否则为纯右值;如果标识符指定位域 ([dcl.struct.bind]),则它是位域。

[基本]/6

变量是由非静态数据成员或对象以外的引用的声明引入的。变量的名称(如果有)表示引用或对象。

宣言

int&& ref2 = std::move(x);

是“非静态数据成员以外的引用声明”。因此,由 表示的实体ref2是一个变量。所以表达式ref2是一个左值。


推荐阅读