Ale*_*ran 1 c++ lambda functional-programming c++11
基本上,我有以下代码:
struct Receiver {
void receive(std::function<void()> f) {
func_ = f;
}
std::function<void()> func_;
};
void pusher(Receiver& r) {
auto wrapper=[&](std::function<void()> w) {
r.receive([&]() {
cout << "Before" << endl;
w();
cout << "After" << endl;
});
};
wrapper([&]() {
cout << "Original" << endl;
});
}
int main() {
Receiver r;
pusher(r);
r.func_();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有一个存储std :: function的类,我们将一个函数存储到该类中。函数是在另一个函数的“包装”本地lambda中创建的。
该代码打印“之前”并崩溃。如果我将整个代码放在“ pusher”中,放入main(),那么一切正常。
我怀疑我们遇到的问题是,当调用r.receive()时,它包含对“ w”的引用,该引用从“推送器”返回后是无效的。
但是我需要将一个lambda传递给接收器,该接收器是通过与另一个lambda进行“装饰”而创建的。
我如何正确地(通常)以引用一些本地lambda的方式装饰lambda并将其传递到其他地方?
按引用捕获[&]会导致lambda w在过期后保留对它的引用。您需要将其复制w [=]或移动到lambda(C ++ 14)中:
r.receive([w=std::move(w)]() {
cout << "Before" << endl;
w();
cout << "After" << endl;
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
89 次 |
| 最近记录: |