基本上,我有以下代码:
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;
}
有一个存储std :: function的类,我们将一个函数存储到该类中。 函数是在另一个函数的“包装”本地lambda中创建的。
代码显示“之前”并崩溃。 如果我将整个代码放在“ pusher”中,然后放入main(),那么一切正常。
我怀疑我们遇到的问题是,当调用r.receive()时,它包含对“ w”的引用,该引用在从“推送器”返回后是无效的。
但是我需要将lambda传递给接收器,该接收器是通过用另一个lambda进行“装饰”而创建的。
我通常如何适当地装饰lambda并引用一些本地lambda并将其传递到其他地方?
答案 0 :(得分:5)
按引用捕获[&]
使lambda在对w
的引用到期后保留对其的引用。您需要复制w
[=]
或将其移动到lambda(C ++ 14)中:
r.receive([w=std::move(w)]() {
cout << "Before" << endl;
w();
cout << "After" << endl;
});