c++ - 为什么命名右值引用是左值表达式?
问题描述
我知道命名引用是左值:
int x = 1;
int& ref1 = x;
int&& ref2 = std::move(x);
我已经阅读了解释——那是因为我们可以获取那些ref1
和ref2
.
但是当我们获取引用的地址时,我们实际上获取了被引用对象的地址,不是吗?所以这个解释似乎并不正确。
那么为什么命名引用是左值呢?
解决方案
根据[expr.prim.id.unqual](8.1.4.1 非限定名称):
[...] 如果实体是函数、变量或数据成员,则表达式为左值,否则为纯右值;如果标识符指定位域 ([dcl.struct.bind]),则它是位域。
每[基本]/6:
变量是由非静态数据成员或对象以外的引用的声明引入的。变量的名称(如果有)表示引用或对象。
宣言
int&& ref2 = std::move(x);
是“非静态数据成员以外的引用声明”。因此,由 表示的实体ref2
是一个变量。所以表达式ref2
是一个左值。
推荐阅读
- java - 仅当文件是Java中的特定版本时,如何将文件上传到GCS?
- python - 训练 NuSVC 后,我可以检索 rho 吗?
- python-3.x - 我想获得一个 api 的日期范围,我将如何编写它?
- heroku - 如何使用 Github Actions 在 Heroku 上部署 NestJS 应用程序?
- javascript - 我想在 Netsuite 仪表板中生成数据表
- javascript - 使用 Spring Boot API 的 React Admin 中的 X-Total-Count 缺少标头错误
- r - 如何使用 SSRS 报告中的 atomvc 文件将数据导入 R
- python - 如何将参数传递给 Sagemaker Predictor 端点?
- excel - 做2次
- javascript - 选中或拖动时将 div 置于其他 div 之上