lambdas和std :: functions在哪里存储由值捕获的变量?
int i = 1;
auto l = [i](void) mutable { return i++; };
std::function<int(void)> f = l;
他们是否致电新运营商?如果我提供自己的新运算符,它是否会被lambdas使用?
答案 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;
...
}
哪个应该让你非常谨慎,因为你可以有悬挂的参考。