【问题标题】:Can I use anonymous lambdas to hold on to static values?我可以使用匿名 lambda 来保留静态值吗?
【发布时间】:2017-06-28 17:44:59
【问题描述】:

我想创建一个我想保留在范围之外的对象,但要设置对其字段的引用。这种方法好用吗?

A* a;
B* b;
[a, b]
{
   static Loader loader("some", "argument", "the constructor", "takes");
   a = loader.getA();
   b = loader.getB();
}();

匿名 lambda 是否随其拥有的值一起销毁?有没有更好的设计模式来实现同样的目标?

好吧,这似乎是一个好方法。我的问题仍然是匿名 lambda 是否在解析时被销毁(以及拥有的静态变量)。

【问题讨论】:

  • @Shiro 问题更像是,匿名 lambdas 是否是临时的?
  • 为什么要让它超出范围?有什么问题?
  • @Barry 我可以很好地将我的临时加载程序保留在范围内,这只是我的痴迷,不将任何我实际上不想再访问的内容保留在范围内。

标签: c++ lambda static singleton c++17


【解决方案1】:

您不需要 lambda 来执行此操作。 static 变量可以在块范围内声明,因此您可以重构为

A* a;
B* b;
{
   static Loader loader("some", "argument", "the constructor", "takes");
   a = loader.getA();
   b = loader.getB();
}
// more code

现在loader 再也无法直接访问(它超出范围),但您可以存储指向它或其成员的指针/引用(它的生命周期持续到程序结束)。


另外,为了回答您关于临时 lambda 的生命周期的问题,如果您不捕获它们,它们就会被销毁。

[](){ /* some code */ }();

将创建一个对象,调用其operator(),然后销毁该临时对象。

【讨论】:

  • @AdamHunyadi 不确定它们是否是首选,但是当您只需要一个新范围时为什么要创建一个对象?
  • 好的,等等,这些大括号没有意义,这不会使loader超出范围...
  • @AdamHunyadi 是的。当您输入{ 时,您将输入一个新范围。一旦你到达//more code,以前的范围现在就消失了,你不能再回到它了。如果你在那里声明了局部变量,它们将被销毁。
  • 啊,你说得对,确实不能访问。但问题是,我也想从 lambda 中返回一些东西,以分配一个引用,这就是我想要一个匿名 lambda 的原因。
  • @AdamHunyadi 那么你可能需要 lambda。
猜你喜欢
  • 2016-04-24
  • 2019-02-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多