c++ - 使用 decltype 推断其类型时,局部变量是左值吗?
问题描述
我正在阅读有关 decltype 的维基百科条目,但我无法理解以下段落:
与 sizeof 运算符类似,decltype 的操作数是不求值的。 [11] 非正式地,由 decltype(e) 返回的类型推导如下:[2]
- 如果表达式 e 引用本地或命名空间范围内的变量、静态成员变量或函数参数,则结果是该变量或参数的声明类型
- 否则,如果 e 是左值,则 decltype(e) 是 T&,其中 T 是 e 的类型;如果 e 是一个 xvalue,则结果是 T&&; 否则,e 是纯右值,结果是 T。
它首先说:“如果表达式 e 引用本地或命名空间范围内的变量”,那么它后面是“否则,如果 e 是左值”。对我来说,这意味着来自本地范围的变量不是左值。我对吗?- 我一直认为局部变量是左值。
也许第 2 项是指我们使用decltype((e))
- 带双括号的情况?我想这就是本 wiki 后面所说的:“更正式地说,规则 1 适用于无括号的 id 表达式和类成员访问表达式。”
解决方案
对我来说,这意味着来自本地范围的变量不是左值
不,这不是正确的阅读方式。该列表不是一堆相互排斥的选项。某些属性可能重叠。在确定decltype
产生的类型时,我们打算应用满足条件的第一个项目。把它想象成一个算法,一个确定decltype
应该如何表现的程序(由于标准是一个技术规范,它几乎就是这样)。
if (e is the unparenthesized name of a variable ...)
result = declared type of e
else if (e is an lvalue expression)
result = type of e &
else if (e is an xvalue expression)
result = type of e &&
else
result = type of e
显然,就像在 C++ 程序中一样,可能有多个条件为真。但是(也像 C++ 程序一样)我们只是选择满足条件的第一个分支。
推荐阅读
- powershell - 检测 Windows 系统区域设置是否使用 UTF-8 代码页的脚本?
- out-of-memory - 什么是 ActiveMQ.Advisory.Consumer.Queue Enqueue #。为什么一直在增加
- numpy - 使用 NumPy 的逐元素矩阵向量乘积
- python - Python Dataframe 从数百万行的大日期时间索引中提取唯一日期列表
- c# - 是否可以在不使用 ToList() 的情况下使用派生类集合中的基类/接口集合
- swift - 具有恒定高度和动态宽度的 UICollectionView 单元格取决于 UIImageView 宽度
- python - Python没有遍历列表中的项目
- python - 有没有办法迭代一个模式以在 Python 中使用 matplotlib 顺时针重复它?
- amazon-web-services - AWS Kinesis Data Analytics:分析流数据可以回答什么问题?
- nginx - *44 connect() 在连接上游 jhipster 时失败(111:连接被拒绝)