【发布时间】:2021-02-16 21:10:35
【问题描述】:
我在看Wikipedia entry about decltype,看不懂下面这段话:
类似于 sizeof 运算符,decltype 的操作数是 [11]非正式地,由 decltype(e) 返回的类型是 推导如下:[2]
- 如果表达式 e 引用本地或命名空间范围内的变量、静态成员变量或函数参数,则 结果是该变量或参数的声明类型
- 否则,如果 e 是左值,则 decltype(e) 是 T&,其中 T 是 e 的类型;如果 e 是一个 xvalue,则结果是 T&&;否则,e 是 prvalue,结果是 T。
它首先说:“如果表达式 e 引用本地或命名空间范围内的变量”,然后它后面是“否则,如果 e 是左值”。对我来说,这意味着来自本地范围的变量不是左值。我对吗? - 我一直认为局部变量是左值。
也许第 2 项是指我们使用decltype((e)) - 带双括号的情况?我想这就是本 wiki 后面所说的:“更正式地说,规则 1 适用于无括号的 id 表达式和类成员访问表达式。”
【问题讨论】:
-
对我来说,这意味着本地范围内的变量不是左值。 这不是它所暗示的。否则适用于变量的范围,而不是其值类别。
-
@fabian 逻辑错误。
std::string() = "foo";也可以,但std::string()不是左值。 “证明”来自阅读标准。 -
@fabian 赋值不能证明左值性:
std::string{} = "this is an rvalue"; -
现在我明白了,第二个将适用于案例:
std::string s; decltype(s="11") d=s;,当然还有std::string s; decltype((s)) d=s; -
没错,任何有名字的东西都是左值。
decltype中的额外规则基本上是一个谎言,以便更容易编写像int x = 1; decltype(x) y = 2;这样的代码。
标签: c++