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。
但是当我们获取引用的地址时,我们实际上获取了被引用对象的地址,不是吗?所以这个解释似乎不太正确。
那么为什么命名引用是左值呢?
根据[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是一个左值。