闭包默认捕获开销



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

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

澄清一下,使用与酒吧被捕获相关的前者是否有任何成本,即使不使用?

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

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

这一措辞是故意保留的,以允许实现围绕这一点进行优化,请参阅缺陷报告750:对引用N2927的仅引用闭包对象的实现约束,其中写道:

新的措辞不再为"通过引用"捕获。"通过引用"捕获的实体的用途影响原始实体,实现这一点的机制是完全由实施决定。

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

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

最新更新