首页 > 解决方案 > 使用 decltype 推断其类型时,局部变量是左值吗?

问题描述

我正在阅读有关 decltype 的维基百科条目,但我无法理解以下段落:

与 sizeof 运算符类似,decltype 的操作数是不求值的。 [11] 非正式地,由 decltype(e) 返回的类型推导如下:[2]

  1. 如果表达式 e 引用本地或命名空间范围内的变量、静态成员变量或函数参数,则结果是该变量或参数的声明类型
  2. 否则,如果 e 是左值,则 decltype(e) 是 T&,其中 T 是 e 的类型;如果 e 是一个 xvalue,则结果是 T&&; 否则,e 是纯右值,结果是 T。

它首先说:“如果表达式 e 引用本地或命名空间范围内的变量”,那么它后面是“否则,如果 e 是左值”。对我来说,这意味着来自本地范围的变量不是左值。我对吗?- 我一直认为局部变量是左值。

也许第 2 项是指我们使用decltype((e))- 带双括号的情况?我想这就是本 wiki 后面所说的:“更正式地说,规则 1 适用于无括号的 id 表达式和类成员访问表达式。”

标签: c++

解决方案


对我来说,这意味着来自本地范围的变量不是左值

不,这不是正确的阅读方式。该列表不是一堆相互排斥的选项。某些属性可能重叠。在确定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++ 程序一样)我们只是选择满足条件的第一个分支。


推荐阅读