引用可能被破坏的静态对象

Cur*_*ous 7 c++ static-variables c++11

假设我有以下代码

Something.hpp

#pragma once

class Something {
public:
    static Something& get();
private: 
    Something();
};
Run Code Online (Sandbox Code Playgroud)

Something.cpp

#include "Something.hpp"
#include <iostream>
using namespace std;

Something& Something::get() {
    static Something something;
    return something;
}
Something::Something() {
    cout << "Something()" << endl;
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include <iostream>
using namespace std;

struct SomethingElse {
    ~SomethingElse() {
        Something::get();
        cout << "~SomethingElse" << endl; 
    }
};

void func() {
    static SomethingElse something_else;
    // do something with something_else
}

int main() {
    func();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Something是否可以创建多个对象实例?标准是否说明了序列化静态对象的破坏?

注意我知道跨越不同的转换单元时文件级静态变量的销毁是未定义的,我想知道在函数作用域静态变量(它具有内置于C++运行时的双重检查锁定模式)的情况下会发生什么.与文件级静态变量相同的翻译单元案例,编译器很容易确保基于变量在代码中的布局(静态)的构造和销毁的序列化,但是当变量动态延迟创建时会发生什么函数被称为?

注意原始变量怎么样?我们可以期望它们包含它们的值直到程序结束吗?因为它们不需要被销毁.


编辑

在cppreference.com上找到了这个(http://en.cppreference.com/w/cpp/utility/program/exit)

如果在线程局部或静态对象B之前对线程局部或静态对象A的构造函数或动态初始化的完成进行了排序,则在破坏A开始之前对B的销毁完成进行排序.

如果这是真的,则序列化每个静态对象的销毁?但我也发现了这一点

https://isocpp.org/wiki/faq/ctors#construct-on-first-use-v2与标准相矛盾

Som*_*ude 4

对于单个翻译单元,静态(和全局非静态)对象的构造和销毁顺序在 C++ 规范中得到了明确定义!

如果您有多个翻译单元(多个源文件),则未定义 TU 之间的构建/销毁顺序。

因此,您显示的代码可能具有未定义的行为