使用非静态成员变量的静态变量初始化

Kad*_*mir 3 c++

在我工作的项目中,我在代码审查过程中看到了如下代码:

class A 
{
   shared_ptr<B> instanceB; 
}

A::A ()
{
   instanceB = make_shared<B>();
   static C localVariable(instanceB.get());
}
Run Code Online (Sandbox Code Playgroud)

我知道静态变量就像全局变量一样,将在程序启动时创建,并且在实例化时将创建instanceB.这可能会崩溃.

在解释我开始考虑instanceB.get()将返回什么值时.最可能垃圾对吗?当我更多地考虑它时,我相信这个代码甚至不应该被编译为什么允许静态变量在其ctors中采用非静态参数?

Pet*_*etr 8

并将在程序启动时创建

不,那是错的.函数中的静态变量是在第一次执行该函数时创建的.因此,您localVariable将收到第一次运行instanceB.get()A::A()将返回的内容.所以没有垃圾localVariable.

这样的设计可能看起来确实很奇怪,但它在语法上是正确的,并且对于编译器具有明确定义的含义.此外,在经典的单例实现中使用非常类似的设计.