gpt4 book ai didi

c++ - 在 decltype(auto) 的情况下,lambda 是否有特殊规则?

转载 作者:可可西里 更新时间:2023-11-01 15:22:18 26 4
gpt4 key购买 nike

如果我没理解错的话this answer和引用标准部分[dcl.type.auto.deduct-5] ,代码:

decltype(auto) a = e;

总是等同于

decltype( e  ) a = e;

但现在问题出现了,如果我将 lambda 表达式改为 decltype(auto) 而不是 e:

decltype(auto) lambda = [](){};

令我惊讶的是,这在 gcc 中均成功编译和 clang .我所经历的震惊的原因在于标准,它明确指出 lambda 不应出现在未计算的操作数中 [expr.prim.lambda#2] (强调我的):

A lambda-expression is a prvalue whose result object is called the closure object. A lambda-expression shall not appear in an unevaluated operand, in a template-argument, in an alias-declaration, in a typedef declaration, or in the declaration of a function or function template outside its function body and default arguments.

但正如我提到的,这个例子相当于:

decltype([](){}) lambda = [](){};

上面显式编写的代码显然是病式的。当然,我们可以假设 decltype 中的语句 [](){} 是一种引用,而不是像 structured bindings 那样的真正引用。 ,但也许标准中有一条特殊规则我错过了 lambda 初始化 decltype(auto)

最佳答案

这个答案是基于我对相关标准文本的解释。这些部分不是很清楚,意见不一,因此目前很难知道它们的确切含义。似乎排除可能的疏忽,主要编译器似乎同意所讨论的定义确实是格式正确的。

此外,我认为如果听到该定义格式错误,那将是非常令人惊讶的。


Reason for the shock I've experienced lays in standard which says specifically that lambda should not occur in unevaluated operand [...]

您在哪里看到 lambda 出现在未计算的上下文中?

decltype(auto) lambda = [](){};

我没看到,因为没有。 lambda 用作初始化程序,这是完全合法的。

现在你的困惑可能来了,因为你似乎认为上面的语句等同于

decltype([](){}) lambda = [](){};

但严格来说,情况并非如此。如果你看一下措辞的语言,有一个小的区别(由我突出显示):

If the placeholder is the decltype(auto) type-specifierT shall be the placeholder alone. The type deduced for T is determined as described in [dcl.type.simple], as though e had been the operand of the decltype.

这里的关键词是虽然。这只是意味着扣除发生就好像它是decltype(e)一样。 , 表示 decltype 的推导规则申请而不是那些 auto对于操作数 e .

在这里,操作数e确实是 lambda,但这是完全合法的,因为标准规定行为与您编写的相同好像 decltype([](){}) , 表示 decltype 的规则扣除适用于 lambda。现在[expr.prim.lambda]/2不适用于此处,因为 lambda 不在未计算的上下文中,因此编译器使用 decltype([](){}) 实际上是合法的推导类型,即 decltype必须对 lambda 使用规则。

当然,如果你写 decltype([](){}) ,程序是病式的,但如上所述,这里的情况并非如此。

在这种情况下,因为 lambda 表达式是纯右值,推导的类型应该只是 lambda 的类型。

至少我是这么理解的...

关于c++ - 在 decltype(auto) 的情况下,lambda 是否有特殊规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44946408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com