我有一个类foo
有bar
一个成员变量.
在该类的另一个成员函数中,我正在编写一个lambda函数:
[bar](void){}
Run Code Online (Sandbox Code Playgroud)
但我不能列入bar
捕获列表.这是为什么?
Cas*_*sey 46
只有具有自动存储持续时间的对象才能被C++ 11中的lambda捕获(即局部变量和函数参数).如果你想要捕获non-static
类数据成员的效果,你可以捕获this
指针,如Danvil的答案:
auto f = [this]{ std::cout << a << std::endl; };
Run Code Online (Sandbox Code Playgroud)
或者将数据成员的值缓存在局部变量中并捕获:
auto a = this->a;
auto f = [a]{ std::cout << a << std::endl; };
Run Code Online (Sandbox Code Playgroud)
这将在C++ 14中更加简洁:
auto f = [a = this->a]{ std::cout << a << std::endl; };
Run Code Online (Sandbox Code Playgroud)
这两个选项之间的选择取决于您是否想要存储的价值a
有正确的现在,或者如果你想检索值a
具有当拉姆达被调用.请注意,在this
捕获的情况下,必须确保指针对象的生命周期包含lambda的生命周期,在销毁对象后调用lambda具有未定义的行为.捕获副本的更简单的情况a
是完全独立的,并且没有这样的生命周期问题.
Dan*_*vil 24
您可以通过this
在捕获列表中说明来捕获类成员.这与成员的事实无关const
.
例:
#include <iostream>
struct Foo
{
const int a = 0;
int b;
Foo() : b{42} {
auto f = [this]() { std::cout << a << " " << b << std::endl; };
// ^^^^
f();
}
};
int main() {
Foo x;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5051 次 |
最近记录: |