【问题标题】:Is a local variable an lvalue when deducing its type using decltype?使用 decltype 推断其类型时,局部变量是左值吗?
【发布时间】:2021-02-16 21:10:35
【问题描述】:

我在看Wikipedia entry about decltype,看不懂下面这段话:

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

  1. 如果表达式 e 引用本地或命名空间范围内的变量、静态成员变量或函数参数,则 结果是该变量或参数的声明类型
  2. 否则,如果 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++


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    相关资源
    最近更新 更多