繁体   English   中英

lambda如何捕获局部静态变量?

[英]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转换为函数指针。


Cppreference:

在lambda的到达范围内,使用通常的非限定名称查找来查找没有初始化器(除了this-capture)之外的任何捕获中的标识符 查找的结果必须是在达到范围内声明的自动存储持续时间的变量

(强调我的)

“捕获”意味着将变量的复制或引用放入lambda对象本身。

全局和static变量具有固定的内存位置 您不需要存储副本或对它们的引用来使用它们,因为它们的位置在编译时是已知的并且不会更改。

(如果你真的想拥有一个全局变量或static变量的副本,你可以使用C ++ 14中的命名捕获创建它,它允许你在lambda对象中创建一个自定义成员变量。但是如果你不需要这样的捕获只想使用那个全局/ static变量。)

另一方面,自动变量没有固定的位置 在完全相同的位置创建的多个lambdas可以引用不同的自动变量。 因此,lambda对象必须捕获这样的变量 - 这意味着包含对使用过的自动变量的引用或它的副本。

通常,lambda被实现为具有变量和单个成员函数的类(在幕后)。 但是当它捕获静态时,这不是必需的 - 因为代码是由编译器生成的,它没有范围规则,它可以直接访问静态。 因此,仅捕获静态变量的lambda将具有空的类成员列表,并且可能优化为简单的函数指针。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM