struct myclass {
myclass(){}
myclass(int qx):z(qx){ }
std::function<void()> create() {
auto px = [z](){
std::cout << z << std::endl;
};
return px;
}
int z;
};
myclass my;
my.z = 2;
auto func = my.create();
func();
my.z = 3;
func();
Run Code Online (Sandbox Code Playgroud)
这段代码将在 gcc 4.6.3 中编译,它会做正确的事情来制作成员变量的副本z
,并且两个 print 都会得到2
. 在 gcc 4.8.2 这不再编译..
error: 'this' was not captured for this lambda function
Run Code Online (Sandbox Code Playgroud)
我想知道为什么这个功能被删除了,因为它非常有用。
我认为您不能直接在 C++11 中执行此操作(有关解决方法,请参阅 @Nawaz 的评论)。但是,C++14 通过广义 lambda 捕获在这种情况下提供了帮助:
auto px = [v = this->z]() // capture by value just ONE member variable
{
std::cout << v << std::endl;
};
Run Code Online (Sandbox Code Playgroud)
例子:
#include <functional>
#include <iostream>
struct myclass {
myclass(): z{} {}
myclass(int qx): z(qx) { }
std::function<void()> create() {
auto px = [v = this->z]() {
std::cout << v << std::endl;
};
return px;
}
int z;
};
int main()
{
myclass my;
my.z = 2;
auto func = my.create();
func();
my.z = 3;
func();
}
Run Code Online (Sandbox Code Playgroud)