C++ 什么时候lambda是微不足道的?
什么时候保证lambda是微不足道的,如果有的话 我假设如果它只捕获平凡的类型或者什么都不捕获,那么它就是平凡的。我没有任何标准的ese来支持这一点 我的动机是把一些代码从Visual C++ 12移到14,发现一些静态断言在处理我假设为微不足道的lambdas时失败了。 例如:C++ 什么时候lambda是微不足道的?,c++,c++11,lambda,typetraits,C++,C++11,Lambda,Typetraits,什么时候保证lambda是微不足道的,如果有的话 我假设如果它只捕获平凡的类型或者什么都不捕获,那么它就是平凡的。我没有任何标准的ese来支持这一点 我的动机是把一些代码从Visual C++ 12移到14,发现一些静态断言在处理我假设为微不足道的lambdas时失败了。 例如: #include <type_traits> #include <iostream> using namespace std; int main() { auto lambda = [
#include <type_traits>
#include <iostream>
using namespace std;
int main()
{
auto lambda = [](){};
cout << boolalpha << is_trivially_copyable<decltype(lambda)>{} << endl;
}
#包括
#包括
使用名称空间std;
int main()
{
自动lambda=[](){};
cout该标准没有指定闭包类型(lambda表达式的类型)是否微不足道。它明确地将此留给实现,这使得它不可移植。我担心您不能依靠您的静态断言生成任何一致的内容
引用C++14(N4140)5.1.2/3:
…一个实现可以定义不同于下面描述的闭包类型,前提是这不会改变可观察的
程序的行为而不是通过更改:
- 闭合类型的尺寸和/或对齐方式
- 闭包类型是否可复制(第9条)
- 闭合类型是否为标准布局类别(第9条),或
- 闭合类型是否为POD类(第9条)
(强调矿山)
在解析该语句中的双重否定之后,我们可以看到实现可以决定闭包类型是可复制、标准布局还是POD
请注意,C++17(N4659),[expr.prim.lambda.closure]8.1.5.1/2.根据标准草案5.1.2/3 lambda表达式[expr.prim.lambda](强调mine):
lambda表达式的类型(也是
闭包对象)是一种唯一的、未命名的非统一类类型,称为
闭包类型-其属性如下所述。此类类型
既不是聚合类型(8.5.1),也不是文字类型(3.9)。闭包
在最小的块作用域、类作用域或
包含相应lambda表达式的命名空间范围[
注意:这决定了相关的名称空间和类的集合
对于闭包类型(3.4.2)。参数类型为
lambdadecrator不会影响这些关联的名称空间和
类。-结束注释]实现可以定义闭包类型
与下文所述不同,前提是这不会改变
程序的可观察行为,而不是通过更改:
(3.1)-闭合类型的尺寸和/或对齐
(3.2)闭合类型是否可复制(第9条)
(3.3)-是否
闭合类型为标准布局类别(第9条),或
(3.4)-是否
闭合类型为POD类(第9条)
实施应:
不将右值引用类型的成员添加到闭包类型
因此,它依赖于实现。gcc 5.2也产生了true
:这对我来说是非常悲哀的:(我根本没想到会有这个答案。我想我学到了一个关于不做假设的教训。c++17是否改变了这一点?