当前位置: 首页 > 知识库问答 >
问题:

在decltype(自动)情况下,lambda是否有特殊规则?

严扬
2023-03-14

如果我正确理解了这个答案,并参考了标准部分[dcl.type.auto.deduct-5],代码:

decltype(auto) a = e;

总是相当于

decltype( e  ) a = e;

但是现在问题出现了,如果我把lambda表达式放在dectype(自动)中,而不是e

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

令我惊讶的是,它在gcc和clang中都编译成功。我所经历的震惊的原因在于标准,其中特别指出lambda不应该出现在未赋值的操作数[expr.prim.lambda#2](emphasis mine)中:

lambda表达式是一个prvalue,其结果对象称为closure对象。lambda表达式不应出现在未赋值的操作数、模板参数、别名声明、typedef声明中,或在函数体和默认参数之外的函数或函数模板声明中。

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

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

上述明确编写的代码显然是格式错误的。当然,我们可以假设decltype中的[]({}语句是一种引用,它并不像结构化绑定那样是一种真正的引用,但也许在标准中有一条特殊的规则,我没有涵盖lambda初始化decltype(auto)

共有1个答案

归浩博
2023-03-14

这个答案基于我对相关标准文本的解释。这些章节并不十分清晰,意见分歧,因此目前很难知道它们的确切含义。除了可能的疏忽之外,主要的编撰者似乎都同意,所讨论的定义确实是格式良好的。

此外,我认为,如果听到这个定义的形式不正确,那将是非常令人惊讶的。

我所经历的震惊的原因在于标准,它特别指出lambda不应该出现在未赋值的操作数中

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

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

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

现在你的困惑可能是因为你似乎认为上面的陈述相当于

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

但严格来说,情况并非如此。如果你看一下措辞的语言,有一点不同(由我强调):

如果占位符是

这里的关键词是“尽管”。它只是意味着演绎就像是decltype(e)一样发生,这意味着decltype的演绎规则适用于操作数e

在这里,操作数e确实是lambda,但这是完全合法的,因为标准要求行为与编写decltype([](){})的行为相同,这意味着decltype演绎规则中的一条适用于lambda。现在[expr.prim.lambda]/2不适用于这里,因为lambda不在未计算的上下文中,所以编译器使用decltype([](){})来推断类型实际上是合法的,这意味着必须对lambda使用decltype规则。

当然,如果您编写dectype([](){}),则程序是格式错误的,但这种情况并非如此,如上所述。

在这种情况下,因为lambda表达式是一个prvalue,所以推导的类型应该只是lambda的类型。

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

 类似资料:
  • 问题内容: 当前,当我发出此SQL时,它将获得不同的用户名。 我有一些不同的用户名,它们代表组,例如。 我想将所有其他用户名(恰好是数字)分组为一个组,例如 我可以实现以下目标吗? 编辑:从答案修改的查询 问题答案: @bfavaretto很好(对他+1),但是如果您不了解前缀或前缀不同,则可以使用类似以下内容的方法:

  • 有一些您在创建port时的特殊情况,我们在这里提一下。 6.1. 共享库 如果您的port安装了一个或多个共享库,那么请定义一个 USE_LDCONFIG make 变量, 在post-install标记把它注册进共享库 缓冲时会调用bsd.port.mk去运行 ${LDCONFIG} -m来指向新库的安装目录。 (通常是 PREFIX/lib) 同样,您也可以适当的在您的 pke-plist文件

  • 如果噪声对连续信道符号的影响是独立的,则可以用一组转换概率来描述。此概率就是发送符号i,收到符号j的概率。最大信道速率可用下式的最大值给出: 其中,我们改变,但保持。由拉格朗日方法可得到以下方程, 。 乘以,并针对s求得,可以证明。设的逆(如果存在的话)为,使得。则: 。 因此, 。 或: 。 这就是用于确定最大值的方程组,其中需要确定C,使得。在完成这一工作后,C为信道容量,是实现这一容量的信道

  • 如果我研究一维上两个球的碰撞检测。假设第一个球在位置0,每帧速度5像素,第二个球在位置3,每帧速度-5像素,那么在下一帧中,第一个球将移动到位置5,第二个球将跳到位置-2。在这种情况下,它们之间没有重叠,因此碰撞检测将失败。我怎么处理这个案子?这里有一张图片来说明:

  • 为什么它抛出一个错误?任何帮助都将不胜感激 编辑:

  • 是否可以在没有实体的情况下使用JpaRepository?在这种情况下,将其替换为DTO。 如下示例所示 这种情况有替代方案吗? 注意:DTO已经映射,但我不想创建视图来将此DTO转换为实体。 我已经验证了这个主题,但没有重大进展,请使用无实体的JpaRepository交互样式 我在试这个 接口- 公共接口BffDTOInterface2{ } 我有这个错误