在下面的代码中,我没有指定任何捕获模式,但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)
您不需要捕获全局static变量或变量.如果要使用它们,则只需捕获自动变量.
因此,是的,您可以将这样的lambda转换为函数指针.
在lambda的到达范围内,使用通常的非限定名称查找来查找没有初始化器(除了this-capture)之外的任何捕获中的标识符.查找的结果必须是在达到范围内声明的自动存储持续时间的变量.
(强调我的)
"捕获"意味着将变量的复制或引用放入lambda对象本身.
全局和static变量具有固定的内存位置.您不需要存储副本或对它们的引用来使用它们,因为它们的位置在编译时是已知的并且不会更改.
(如果你真的想拥有一个全局static变量或变量的副本,你可以使用C++ 14中的命名捕获创建它,它允许你在lambda对象中创建一个自定义成员变量.但如果你只是这样的捕获是没有必要的想要使用那个全局/ static变量.)
另一方面,自动变量没有固定的位置.在完全相同的位置创建的多个lambdas可以引用不同的自动变量.因此,lambda对象必须捕获这样的变量 - 这意味着包含对使用过的自动变量的引用或它的副本.
| 归档时间: |
|
| 查看次数: |
1029 次 |
| 最近记录: |