具有捕获引用的长寿命(非本地)λ

Long lived (nonlocal) lambda with captured reference

本文关键字:引用      更新时间:2023-10-16

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

我最近发现我正在使用的库有一段代码,它实现了类似于以下功能的内容:

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();
}
};

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

在长寿命(非局部(lambda中捕获引用的共识是什么?

当向库的维护者询问是否让 lambda 捕获引用时,给出的原因是他希望在调用Foo::setBar()后可以修改变量(bar引用(。实现相同功能的另一种解决方案可能是bar成为shared_ptr<int>但也许这太严厉了。

还有其他好的替代方案可以使代码"安全"吗?

捕获引用并不比捕获指针更危险或更少。唯一的区别是,与使用引用相比,您可能更有可能谨慎使用原始指针并考虑其生存期。

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