我可以使用匿名lambdas来保持静态值吗?

Ada*_*adi 2 c++ lambda singleton static c++17

我想创建一个我想要超出范围的对象,但是设置对其字段的引用.这种做法有什么好处吗?

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

匿名lambda是否以其拥有的价值被摧毁?是否有更好的设计模式来实现同样的目标?

好吧,这似乎是一个很好的方法.我的问题仍然是,如果匿名lambda在解析时被破坏(并且使用它拥有的静态变量).

Nat*_*ica 6

你不需要lambda来做这件事. static变量可以在块范围内声明,因此您可以重构

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

现在loader永远不能再次直接访问(它超出范围)但你可以存储指针/引用它或它的成员(它的生命持续到程序结束).


另外,为了回答关于临时lambda的生命周期的问题,如果你没有捕获它们,它们就会被破坏.

[](){ /* some code */ }();
Run Code Online (Sandbox Code Playgroud)

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