C++ 使用decltype推断其类型时,局部变量是否为左值?

C++ 使用decltype推断其类型时,局部变量是否为左值?,c++,C++,我正在读这篇文章,但我不能理解下面这段话: 与sizeof运算符类似,decltype的操作数为 未计算。[11]非正式地说,decltypee返回的类型是 推断如下:[2] 如果表达式e引用本地或命名空间范围中的变量、静态成员变量或函数参数,则 结果是变量或参数的声明类型 否则,如果e是左值,decltypee是T&,其中T是e的类型;如果e是x值,则结果为T&;否则,e是a pr值,结果为T。 它首先说:如果表达式e引用本地或命名空间范围内的变量,那么如果e是左值,则后面跟着另一个变量。对我

我正在读这篇文章,但我不能理解下面这段话:

与sizeof运算符类似,decltype的操作数为 未计算。[11]非正式地说,decltypee返回的类型是 推断如下:[2]

如果表达式e引用本地或命名空间范围中的变量、静态成员变量或函数参数,则 结果是变量或参数的声明类型 否则,如果e是左值,decltypee是T&,其中T是e的类型;如果e是x值,则结果为T&;否则,e是a pr值,结果为T。 它首先说:如果表达式e引用本地或命名空间范围内的变量,那么如果e是左值,则后面跟着另一个变量。对我来说,这意味着来自局部范围的变量不是左值。我说得对吗我一直认为局部变量是左值

也许第2项指的是我们使用decltype-和双括号的情况?我想这就是本文后面所说的:更正式地说,规则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++程序一样,我们只需要满足条件满足的第一个分支。这不是它所暗示的。否则适用于变量的范围,而不是其值类别。@fabian错误逻辑。std::string=foo;同样有效,但是std::string不是左值。证明来自阅读标准。@fabian赋值不是左值的证明:现在我明白了,第二个将应用于case as:std::string s;decltypes=11d=s;当然还有std::string s;decltypes d=s;确切地说,任何有名字的东西都是左值。decltype中的额外规则基本上是一个谎言,使编写int x=1这样的代码更容易;decltypex y=2;。