c++ 是否保证 header-initialized static const 成员跨编译单元和库共享单个实例?

Do c++ guarantee header-initialized static const member to share a single instance across compile units and libraries?

让我们考虑一个代码

header:

class uid
{
public:
    uid () {++i; }
    static int i;
};

class foo
{
public:
    const static uid id;
}   

来源:

static int uid::i = 0;

header 可以包含在多个源文件中,在编译器单元和库之间共享。

是否保证 foo::id 只有一个实例,foo::id::id() 会在 run-time 被调用一次,最重要的是 foo::id.i 在程序和它的库中到处都一样吗?另一方面,另一个共享的 header 可能有 bar class 和它自己的 static const uid id,预计与 foo 的不同。也有保障吗?如果是这样,实际存储 foo::id 符号的位置,尤其是在共享 (dynamic-linked) 库的情况下。

由于某些原因,c++ 禁用

class foo
{
public:
    const static int id = create_uid(); // forbidden
}   

只允许 compile-time const 初始化或在源文件中初始化。所以有一些理由禁用这种方法。

是的,这是保证。

该符号位于从定义 object 的源文件构建的翻译单元中。的确,这就是为什么我们必须将它定义为一个!

链接器确保项目中 header 副本的所有引用都与唯一定义匹配。

至于为什么 C++ 不允许您内联初始化静态成员:它可以,但在 C++98 中不行。为此你需要 C++17。