在我正在工作的项目中,我在代码审查过程中看到了如下代码:
class A
{
shared_ptr<B> instanceB;
}
A::A ()
{
instanceB = make_shared<B>();
static C localVariable(instanceB.get());
}
我知道静态变量类似于全局变量,将在程序启动时创建,并且在实例化时将创建instanceB。这可能会崩溃。
在解释我开始考虑instanceB.get()将返回什么值时。最可能垃圾对吗?当我想到更多的时候 我相信这段代码甚至不应该被编译为什么允许静态变量在其ctors中获取非静态参数?
答案 0 :(得分:8)
将在程序启动时创建
不,那是错的。函数中的静态变量是在第一次执行该函数时创建的。因此,当localVariable
首次投放时,instanceB.get()
会收到A::A()
将返回的内容。因此localVariable
中不会有垃圾。
这样的设计可能看起来确实很奇怪,但它在语法上是正确的,并且对于编译器具有明确定义的含义。此外,在经典的单例实现中使用了非常相似的设计。