gpt4 book ai didi

c++ - 具有捕获引用的长生命周期(非本地)lambda

转载 作者:太空宇宙 更新时间:2023-11-04 12:44:02 25 4
gpt4 key购买 nike

问题已更新以显示更完整的示例。

我最近发现我正在使用的一个库有一段代码实现了类似于以下功能的东西:

class Foo {
std::function<void()> FuncPtr;
public:
template <typename Type>
void setBar(std::set<Type> &bar) {
FuncPtr = [&bar](){
//Do something with bar
};
}
void useBar() {
FuncPtr();
}
};

这对我来说似乎很危险,因为无法保证 bar 的变量Foo::useBar() 时引用仍然存在叫做。话虽如此,对bar的要求被记录在案。

在长期(非本地)lambda 中捕获引用的共识是什么?

当询问库的维护者关于让 lambda 捕获引用时,给出的原因是他希望在调用 bar 之后修改变量(即 Foo::setBar() 引用)成为可能。 .实现相同功能的替代解决方案可能是 bar成为shared_ptr<int>但也许这太过分了。

还有其他好的替代方法可以使代码“安全”吗?

最佳答案

捕获引用与捕获指针一样危险。唯一的区别是,与使用引用相比,您可能更倾向于谨慎使用原始指针并考虑其生命周期。

如您所说,安全的方法是使用 shared_ptr。这是否太重量级取决于您的应用程序,如果您主要只是调用 useBar(),那么取消引用 shared_ptr 是相当便宜的。

关于c++ - 具有捕获引用的长生命周期(非本地)lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52611912/

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