程序退出期间的函数局部静态初始化

the*_*oyn 15 c++ static object-lifetime language-lawyer

标准对程序退出期间的函数局部静态初始化有什么看法? 编辑:为了清楚起见,我的意思是代码示例中的情况 - 本地静态b是在构造另一个静态之后a构造的(因此应该b在之前销毁a),但b也在a的析构函数期间构造,所以它应该立即销毁吗?后?优?

我没有设法找到有关此事的任何参考资料。

我想知道这种情况是 UB,还是应该有一些定义的行为?

下面的代码就是一个例子:

struct B{};

void foo()
{
    static B b;
}

struct A
{
    ~A() { foo(); }
};

int main()
{
    static A a;
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如您所见,A 的析构函数会在程序退出时发生(因为它具有静态存储),并且它会尝试构造 B 静态实例。

我对 C++17 更感兴趣,如果它在这个主题上有什么不同的话。

Sau*_*rai -2

由于对象 B 是由 A 的析构函数创建的,因此它会在程序退出之前被销毁。我在代码中添加了 print 语句,使其看起来像这样:

#include <iostream>

struct B
{
    ~B()
    {
        std::cout << "Called B's Destructor...!";
    }
};

void foo()
{
    static B b;
}

struct A
{
    ~A() {
        foo();
        std::cout << "Called A's Destructor...!\n";
    }
};

int main()
{
    static A a;
    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它打印以下内容:

Called A's Destructor...!
Called B's Destructor...!
Run Code Online (Sandbox Code Playgroud)

最重要的是,静态变量将在程序结束时(本地或全局)按照创建的顺序被销毁。

  • 一个很好的答案,但在这种情况下请注意问题上的 [语言律师] 标签以及该标签对答案提出的要求。 (4认同)
  • 谢谢!我知道它编译并成功运行,但在 UB 的情况下也可能发生......我正在尝试获得更正式的答案 (2认同)