寿命长(非本地)lambda,具有捕获的参考

时间:2018-10-02 15:46:15

标签: c++

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

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

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

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

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

当询问库的维护者有关lambda捕获引用的信息时,给出的原因是他希望能够在调用bar之后修改变量(Foo::setBar()个引用) 。实现相同功能的另一种解决方案是将bar设为shared_ptr<int>,但这也许太笨拙了。

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

1 个答案:

答案 0 :(得分:0)

捕获引用与捕获指针的危险差不多。唯一的区别是,与参考相比,您更可能会谨慎使用原始指针并仔细考虑其寿命。

您已经说过,安全的方法是使用shared_ptr。是否太重取决于您的应用程序,如果您大多数情况下只是调用useBar(),然后取消引用shared_ptr是相当便宜的。