让我们考虑一段代码
头部。
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++不允许你内联初始化静态成员:它 是否但不是在C++98中。你需要用C++17来实现。