关闭默认捕获开销

时间:2015-10-30 12:36:47

标签: c++ lambda c++14

使用默认捕获模式是否有任何开销?

{
   Foo foo = ...;
   Bar bar = ...;
   [&]()
   {
       write(foo);
   }
}

{
   Foo foo = ...;
   Bar bar = ...;
   [&foo]()
   {
       write(foo);
   }
}

澄清是否有任何成本使用前者与棒相关即使没有使用?

2 个答案:

答案 0 :(得分:3)

未指定lambda如何处理通过引用捕获的实体,来自草案C ++ 14标准(N4140)部分5.1.2 [expr.prim.lambda]:

  

如果实体是隐式或显式的,则通过引用捕获实体   已捕获但未通过副本捕获。没有具体说明   在闭包中声明了其他未命名的非静态数据成员   通过引用捕获的实体的类型。匿名成员   工会不得通过参考

获取

此措辞故意保持开放以允许实施围绕此进行优化,请参阅defect report 750: Implementation constraints on reference-only closure objects 哪些引用N2927,其中包含:{/ p>

  

新措辞不再指定任何重写或关闭成员   "参考"捕获。捕获的实体的使用"通过引用"   影响原始实体,并实现这一点的机制   完全离开了实施。

答案 1 :(得分:2)

N3337 5.1.2 / 15或N4527(C ++ 14最终草案)5.1.2 / 16

  

如果实体是隐式或显式的,则通过引用捕获实体   已捕获但未通过副本捕获。 是否未指明   在闭包中声明了其他未命名的非静态数据成员   通过引用捕获的实体的类型。