c++ - 未计算上下文中的 Lambda(需要表达式)
问题描述
我知道关于这个话题有几个问题,但请听我说完。
我知道我们可以在未评估的上下文(如decltype
)中使用无捕获 lambda,但是捕获的 lambda 呢?
我在当前的 C++ 标准中找不到任何表明自 C++20 以来这根本是个问题的东西,但我绝不是语言律师。
不过,我看到的是,主要编译器的结果不同。
这些概念有效吗?
template <typename T>
concept C1 = requires { []{}; };
template <typename T>
concept C2 = requires(T t) { [&t]{}; };
解决方案
我知道我们可以在未评估的上下文中使用无捕获的 lambda
这不仅限于无状态 lambda。P0315R4(未评估上下文中 lambdas 的措辞)删除了 lambdas(不仅仅是无状态的)的限制,不会出现在未评估的 lambdas 中,同时修改了与限制的原始意图相关的某些部分的措辞:
本文介绍的核心语言更改有点棘手。原因是我们移除了对 lambda 表达式的许多限制,但我们仍然希望将闭包类型排除在外部函数的签名之外,这对于实现来说将是一场噩梦。
这篇论文没有对 lambdas wrt 概念引入特别的限制,我们可以简单地转向[temp.concept]/6来管理这种情况:
概念定义的约束表达式是未计算的操作数 ([expr.context])。
由于不再有任何一般限制 lambas(无状态或非状态)在未评估的上下文中不作为操作数出现,而且在概念的上下文中也没有明确的限制,因此概念C1
和C2
格式都是正确的。
事实上,与某些声明中对闭包类型的限制相比,概念没有根据[temp.concept]/5实例化,并且确实属于在 P0315R4 中被认为“有点棘手”的 ODR 考虑。
推荐阅读
- scala - TestProbe 没有收到来自 RouteSpec 的消息
- json - 具有不同“显示名称”的两个文件夹的相同 ID
- javascript - 无法正确获取 localStorage 中存储的数据
- java - 在业务逻辑层传递数据
- converters - 将 txt 转换为 md,将 unix enf-of-line 更改为双倍空格
- r - R plm 与 Stata reghdfe
- android - Xamarin Android 填充和布局差异
- css - 使用带有 Calc() 的 CSS 变量在第二个参数时不起作用
- asp.net - 从数据库值生成前端设计
- solr - 尝试启动 Solr 时导致 Java 异常“地址已在使用”的原因是什么?