C ++ lambda& std :: function按值内存管理捕获?

时间:2015-10-16 12:40:34

标签: c++ memory-management lambda new-operator

lambdas和std :: functions在哪里存储由值捕获的变量?

int i = 1;
auto l = [i](void) mutable { return i++; };
std::function<int(void)> f = l;

他们是否致电新运营商?如果我提供自己的新运算符,它是否会被lambdas使用?

2 个答案:

答案 0 :(得分:0)

来自[expr.prim.lambda] 5.1.2(15)

  

如果隐式捕获实体并且捕获默认值为=,或者如果使用不是形式为&amp;的捕获显式捕获实体,则通过副本捕获实体。标识符或&amp;标识符初始化器。 对于按副本捕获的每个实体,在闭包类型中声明一个未命名的非静态数据成员。这些成员的声明顺序未指定。如果实体不是对对象的引用,则这种数据成员的类型是对应的捕获实体的类型,否则是引用的类型。 [注意:如果   捕获实体是对函数的引用,对应的数据成员也是对函数的引用。 - 注意]匿名工会的成员不得被副本捕获。

强调我的

因此,按值捕获的变量将作为闭包类型的成员存储。根据5.1.2(3)

未指定闭包类型
  

lambda-expression的类型(也是闭包对象的类型)是一个唯一的,未命名的nonunion类类型 - 称为闭包类型 - 其属性如下所述。此类类型既不是聚合(8.5.1)也不是文字类型(3.9)。闭包类型在包含相应lambda表达式的最小块作用域,类作用域或命名空间作用域中声明。

答案 1 :(得分:0)

在编译时,lambdas实际上变成了类。所以如果你有以下内容。

int a; Widget widget; 

auto somelambda = [=a,&widget](){

}

您实际上可以将其视为

class SomeLambda
{
int a;
Widge& w;
...
}

哪个应该让你非常谨慎,因为你可以有悬挂的参考。