C++ 什么时候lambda是微不足道的?

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 = [

什么时候保证lambda是微不足道的,如果有的话

我假设如果它只捕获平凡的类型或者什么都不捕获,那么它就是平凡的。我没有任何标准的ese来支持这一点

我的动机是把一些代码从Visual C++ 12移到14,发现一些静态断言在处理我假设为微不足道的lambdas时失败了。 例如:

#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是否改变了这一点?