未计算上下文中的 Lambda 表达式(需要表达式)

Tim*_*imo 5 c++ language-lawyer c++20

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

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

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

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

这些概念有效吗?

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

template <typename T>
concept C2 = requires(T t) { [&t]{}; };
Run Code Online (Sandbox Code Playgroud)

dfr*_*fri 2

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

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

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

本文没有对 lambda 概念引入任何特定约束,我们可以简单地转向[temp.concept]/6来管理这种情况:

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

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

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