我可以使用匿名lambdas来保存静态值吗?
我想要创建一个对象,我想保持超出范围,但设置对其字段的引用。这种方法有什么好处?我可以使用匿名lambdas来保存静态值吗?
A* a;
B* b;
[a, b]
{
static Loader loader("some", "argument", "the constructor", "takes");
a = loader.getA();
b = loader.getB();
}();
匿名lambda是否被其拥有的值破坏?是否有更好的设计模式来实现相同的目标?
好吧,这似乎是一个很好的方法。我的问题仍然是匿名lambda在解析时是否被破坏(以及它拥有的静态变量)。
你不需要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不知道他们是否是首选,但为什么创建一个对象,当你需要的只是一个新的范围? – NathanOliver
好吧,等等,这些大括号是毫无意义的,这不会使'loader'超出范围...... –
@AdamHunyadi是的。当你输入''时,你输入一个新的范围。一旦你得到'//更多的代码',以前的范围现在已经消失了,你不能返回它。如果你在那里声明了局部变量,它们将被销毁。 – NathanOliver
[lambda函数对象中的静态变量如何工作?](https://stackoverflow.com/questions/8391058/how-do-static-variables-in-lambda-function-objects-work) – Shiro
@Shiro问题更多的是,匿名lambda是不是临时的? –
为什么你想保持它的范围?有什么问题? – Barry