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

我最近发现,我正在使用的库包含一段代码,该代码实现与以下功能相似的内容:

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>,但这也许太笨拙了。

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

最佳答案

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

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

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

10-11 22:23
查看更多