[英]How does lambda capture local static variable?
在下面的代码中,我没有指定任何捕获模式,但some_static在闭包内是可见的。 所以问题是它是否实际被捕获,或者以某种方式以其他方式引用。
额外的问题是是否允许编译器将这样的lambda转换为自由函数而不是闭包 - 这可能是因为没有指定捕获列表。
std::vector<std::function<bool(int)>> filters;
int main()
{
static int some_static = 1;
filters.emplace_back([](int){
return some_static == 2;
});
}
您不需要捕获全局变量或static
变量。 如果要使用它们,则只需捕获自动变量。
因此,是的,您可以将这样的lambda转换为函数指针。
在lambda的到达范围内,使用通常的非限定名称查找来查找没有初始化器(除了this-capture)之外的任何捕获中的标识符 。 查找的结果必须是在达到范围内声明的自动存储持续时间的变量 。
(强调我的)
“捕获”意味着将变量的复制或引用放入lambda对象本身。
全局和static
变量具有固定的内存位置 。 您不需要存储副本或对它们的引用来使用它们,因为它们的位置在编译时是已知的并且不会更改。
(如果你真的想拥有一个全局变量或static
变量的副本,你可以使用C ++ 14中的命名捕获创建它,它允许你在lambda对象中创建一个自定义成员变量。但是如果你不需要这样的捕获只想使用那个全局/ static
变量。)
另一方面,自动变量没有固定的位置 。 在完全相同的位置创建的多个lambdas可以引用不同的自动变量。 因此,lambda对象必须捕获这样的变量 - 这意味着包含对使用过的自动变量的引用或它的副本。
通常,lambda被实现为具有变量和单个成员函数的类(在幕后)。 但是当它捕获静态时,这不是必需的 - 因为代码是由编译器生成的,它没有范围规则,它可以直接访问静态。 因此,仅捕获静态变量的lambda将具有空的类成员列表,并且可能优化为简单的函数指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.