首页 > 解决方案 > 未计算上下文中的 Lambda(需要表达式)

问题描述

我知道关于这个话题有几个问题,但请听我说完。

我知道我们可以在未评估的上下文(如decltype)中使用无捕获 lambda,但是捕获的 lambda 呢?

我在当前的 C++ 标准中找不到任何表明自 C++20 以来这根本是个问题的东西,但我绝不是语言律师。

不过,我看到的是,主要编译器的结果不同。

这些概念有效吗?

template <typename T>
concept C1 = requires { []{}; };

template <typename T>
concept C2 = requires(T t) { [&t]{}; };

标签: c++language-lawyerc++20

解决方案


我知道我们可以在未评估的上下文中使用无捕获的 lambda

这不仅限于无状态 lambda。P0315R4(未评估上下文中 lambdas 的措辞)删除了 lambdas(不仅仅是无状态的)的限制,不会出现在未评估的 lambdas 中,同时修改了与限制的原始意图相关的某些部分的措辞:

本文介绍的核心语言更改有点棘手。原因是我们移除了对 lambda 表达式的许多限制,但我们仍然希望将闭包类型排除在外部函数的签名之外,这对于实现来说将是一场噩梦。

这篇论文没有对 lambdas wrt 概念引入特别的限制,我们可以简单地转向[temp.concept]/6来管理这种情况:

概念定义的约束表达式是未计算的操作数 ([expr.context])。

由于不再有任何一般限制 lambas(无状态或非状态)在未评估的上下文中不作为操作数出现,而且在概念的上下文中也没有明确的限制,因此概念C1C2格式都是正确的。

事实上,与某些声明中对闭包类型的限制相比,概念没有根据[temp.concept]/5实例化,并且确实属于在 P0315R4 中被认为“有点棘手”的 ODR 考虑。


推荐阅读