C++ C++;兰博达;std::通过值内存管理捕获功能?

C++ C++;兰博达;std::通过值内存管理捕获功能?,c++,memory-management,lambda,new-operator,C++,Memory Management,Lambda,New Operator,lambdas和std::函数在哪里存储由值捕获的变量 int i = 1; auto l = [i](void) mutable { return i++; }; std::function<int(void)> f = l; inti=1; auto l=[i](void)可变{return i++;}; std::函数f=l; 他们给新接线员打电话了吗?如果我提供自己的新操作符,lambdas会使用它吗?来自[expr.prim.lambda]5.1.2(15) 如果实体隐

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

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

他们给新接线员打电话了吗?如果我提供自己的新操作符,lambdas会使用它吗?

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

如果实体隐式捕获且捕获默认值为=或如果实体是使用非&identifier或&identifier初始值设定项形式的捕获显式捕获的,则复制将捕获该实体对于复制捕获的每个实体,在闭包类型中声明一个未命名的非静态数据成员。这些成员的申报顺序未明。如果实体不是对对象的引用,则此类数据成员的类型为相应捕获实体的类型,否则为引用类型。[注:如果 捕获的实体是对函数的引用,相应的数据成员也是对函数的引用。-结束注]匿名联盟的成员不得通过副本捕获

重点矿山

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

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


在编译时,lambda实际上被转换成类。所以如果你有以下几点

int a; Widget widget; 

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

}
你可以把它想象成

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

这应该让您非常谨慎,因为您可能会有悬空引用。

lambda是将变量保存为成员数据的类,而
std::function
只是保存lambda。根据可调用对象的大小,它要么适合
std::function
内部,要么位于堆上。