Closure默认捕获开销

Jos*_*osé 5 c++ lambda c++14

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

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

{
   Foo foo = ...;
   Bar bar = ...;
   [&foo]()
   {
       write(foo);
   }
}
Run Code Online (Sandbox Code Playgroud)

澄清是否有任何使用前者的成本,即使没有使用,也会被捕获?

Sha*_*our 4

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

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

这个措辞故意保留开放,以允许实现围绕此进行优化,请参阅缺陷报告 750:仅引用闭包对象的实现约束,其中引用了N2927,其中表示:

新措辞不再为“通过引用”捕获指定任何重写或闭包成员。“通过引用”捕获的实体的使用会影响原始实体,并且实现此目的的机制完全留给实现。