Lambdas in unevaluated context (requires expressions)(未计算上下文中的lambdas(需要表达式))
问题描述
我知道关于这个话题有几个问题,但请听我说完。
我知道我们可以在未评估的上下文中使用无捕获lambdas(如decltype),但是可以捕获的lambdas怎么办?
我在当前的C++标准中找不到任何可以表明这是C++20以后的问题的东西,但我绝不是语言律师。
我所看到的是,主要的编译器在their results方面有所不同。
这些概念有效吗?
template <typename T>
concept C1 = requires { []{}; };
template <typename T>
concept C2 = requires(T t) { [&t]{}; };
推荐答案
我知道我们可以在未评估的上下文中使用无捕获lambdas
这并不局限于无状态lambda。P0315R4(未评估的上下文中的lambdas的措辞)删除了lambdas(不仅仅是无状态的lambdas)不能出现在未评估的lambdas中的限制,同时修改了与限制的原始意图相关的某些部分的措辞:
本文介绍的核心语言更改有些棘手。原因是我们删除了对lambda表达式的许多限制,但我们仍然希望将闭包类型排除在外部函数的签名之外,这将是实现的噩梦。
本文对lambdas w.r.t.概念,我们可以简单地求助于[temp.concept]/6来管理这种情况:
概念定义的约束表达式是未计算的操作数([Expr.Context])。
由于不再有一般限制Lambas(无状态或无状态)不作为unevaluated contexts中的操作数出现,而且在概念上下文中也没有明确的限制,因此C1和C2这两个概念都是形式化的。
事实上,与某些声明中对闭包类型的限制相比,[temp.concept]/5中的概念没有实例化,并且确实属于P0315R4中被认为有点棘手的ODR-注意事项。
这篇关于未计算上下文中的lambdas(需要表达式)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:未计算上下文中的lambdas(需要表达式)
基础教程推荐
- 为什么 RegOpenKeyEx() 在 Vista 64 位上返回错误代码 2021-01-01
- 我应该对 C++ 中的成员变量和函数参数使用相同的名称吗? 2021-01-01
- 初始化列表*参数*评估顺序 2021-01-01
- 通过引用传递 C++ 迭代器有什么问题? 2022-01-01
- 非静态 const 成员,不能使用默认赋值运算符 2022-10-09
- 为什么派生模板类不能访问基模板类的标识符? 2021-01-01
- 为什么 typeid.name() 使用 GCC 返回奇怪的字符以及如 2022-09-16
- CString 到 char* 2021-01-01
- 如果我为无符号变量分配负值会发生什么? 2022-01-01
- GDB 显示调用堆栈上函数地址的当前编译二进制文 2022-09-05
