orl*_*rlp 10 c++ templates static-variables one-definition-rule
例如,请考虑以下标题:
#include <iostream>
template<bool = true>
struct A {
A() {
static int x;
std::cout << &x << "\n";
}
};
static A<> a;
Run Code Online (Sandbox Code Playgroud)
如果我有两个不同的C++文件,包括这个文件,它会打印两次相同的地址,保证怎么办?更重要的是,如果x是具有非平凡构造函数的不同类型的对象,是否可以保证只运行一次?
标准[C++ 11 14.8/2]说
从模板实例化的每个函数模板特化都有自己的任何静态变量的副本.
我假设(并且真诚地希望)模板类的成员函数以相同的方式处理,尽管我找不到这样说的特定语言.
在任何情况下,除了在多线程上下文中初始化静态变量相关的常见风险之外,我确信这样可以.A<true>::A()(并且内部" static int A<true>::A::x")将被标记为弱符号,并且在链接时将挑选一个版本,与任何其他模板相同.(显然,实例化A<false>将与...截然不同A<true>.)
编辑评论:
关于不同翻译单位的担忧似乎由[3.2/5]部分涵盖,定义了ODR:
如果D是模板并且在多个翻译单元中定义,那么...... [提供的定义是相同的] ......程序应该表现得好像有一个单独的D定义.
实际的要求是更多的语言 - 律师(实例化时的依赖名称必须相同,等等),但我认为这是让你明白的一点:-)