c++是否保证头初始化的静态constitut成员在不同编译单元和库中共享一个实例?

问题描述 投票:0回答:1

让我们考虑一段代码

头部。

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

class foo
{
public:
    const static uid id;
}   

源文件。

static int uid::i = 0;

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

是否能保证只有一个实例脱胎于 foo::id,即 foo::id::id() 将在运行时被调用一次,而且最重要的是,将把 foo::id.i 在程序和它的库中到处都是一样的?另一方面,另一个共享头可以有 bar 类,有自己的 static const uid id 预计将不同于 foo'的一个。也是有保障的吗?如果是这样,实际上在哪里 foo::id 符号,特别是在共享(动态链接)库的情况下。

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

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

只允许编译时的const初始化或源文件中的初始化。所以有一些理由禁用这种方法。

c++ static-members c++98
1个回答
4
投票

是的,这是保证的。

符号住在从定义对象的源文件建立的翻译单元中。事实上,这就是 何以 我们必须在一个定义中定义它!

链接器会确保在你的项目中,该头的所有副本的引用都与唯一的定义相匹配。

至于为什么C++不允许你内联初始化静态成员:它 是否但不是在C++98中。你需要用C++17来实现。

© www.soinside.com 2019 - 2024. All rights reserved.