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

mik*_*ike 2 c++ c++11

在下面的代码中,我没有指定任何捕获模式,但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;
    });
}
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 7

您不需要捕获全局static变量或变量.如果要使用它们,则只需捕获自动变量.

因此,是的,您可以将这样的lambda转换为函数指针.


Cppreference:

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

(强调我的)

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

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

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

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