2017-06-28 37 views
2

我想要创建一个对象,我想保持超出范围,但设置对其字段的引用。这种方法有什么好处?我可以使用匿名lambdas来保存静态值吗?

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

匿名lambda是否被其拥有的值破坏?是否有更好的设计模式来实现相同的目标?

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

+0

[lambda函数对象中的静态变量如何工作?](https://stackoverflow.com/questions/8391058/how-do-static-variables-in-lambda-function-objects-work) – Shiro

+0

@Shiro问题更多的是,匿名lambda是不是临时的? –

+0

为什么你想保持它的范围?有什么问题? – Barry

回答

6

你不需要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(),然后销毁该临时对象。

+0

@AdamHunyadi不知道他们是否是首选,但为什么创建一个对象,当你需要的只是一个新的范围? – NathanOliver

+0

好吧,等等,这些大括号是毫无意义的,这不会使'loader'超出范围...... –

+0

@AdamHunyadi是的。当你输入''时,你输入一个新的范围。一旦你得到'//更多的代码',以前的范围现在已经消失了,你不能返回它。如果你在那里声明了局部变量,它们将被销毁。 – NathanOliver

相关问题