问题已更新,以显示更完整的示例。
我最近发现,我正在使用的库包含一段代码,该代码实现与以下功能相似的内容:
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/