gpt4 book ai didi

c++ - С++ 将 lambda 包装在函数内的另一个 lambda 中

转载 作者:行者123 更新时间:2023-11-30 01:02:09 25 4
gpt4 key购买 nike

基本上,我有这段代码:

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 中创建的。

代码打印“Before”并崩溃。如果我将“pusher”中的整个代码放入 main() 中,那么一切正常。

我怀疑问题出在调用 r.receive() 时,它包含对从“pusher”返回后无效的“w”的引用。

但我需要将一个 lambda 传递给一个接收者,该接收者是由另一个 lambda 的“装饰”创建的。

我如何(通常)正确地使用对某个本地 lambda 的引用来修饰 lambda 并将其传递到其他地方?

最佳答案

通过引用捕获 [&] 导致 lambda 在过期后保留对 w 的引用。您需要复制 w [=] 或将其移动到 lambda (C++14) 中:

r.receive([w=std::move(w)]() {
cout << "Before" << endl;
w();
cout << "After" << endl;
});

关于c++ - С++ 将 lambda 包装在函数内的另一个 lambda 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56676460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com