问题已更新,以显示更完整的示例。
我最近发现我正在使用的库中有一段代码,该代码实现了类似于以下功能的内容:
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>
,但这也许太笨拙了。
还有其他替代方法可以使代码“安全”吗?
答案 0 :(得分:0)
捕获引用与捕获指针的危险差不多。唯一的区别是,与参考相比,您更可能会谨慎使用原始指针并仔细考虑其寿命。
您已经说过,安全的方法是使用shared_ptr
。是否太重取决于您的应用程序,如果您大多数情况下只是调用useBar()
,然后取消引用shared_ptr
是相当便宜的。