为什么命名右值引用是左值表达式?

beg*_*ses 7 c++ rvalue-reference value-categories

我知道命名引用是左值:

int x = 1;
int& ref1 = x;
int&& ref2 = std::move(x);
Run Code Online (Sandbox Code Playgroud)

我读过解释——那是因为我们可以获取那些ref1和的地址ref2

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

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

L. *_* F. 5

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

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

[基本]/6

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

声明

int&& ref2 = std::move(x);
Run Code Online (Sandbox Code Playgroud)

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