【发布时间】:2018-10-03 15:00:54
【问题描述】:
请参阅以下内容:
https://en.cppreference.com/w/cpp/language/definition#One_Definition_Rule
http://eel.is/c++draft/basic.def.odr#12
它声明类模板的多个定义、类模板的静态数据成员、部分模板特化等是允许的,并将作为一个单独的定义。太好了……但它没有在任何地方提到变量模板?
如果我在多个翻译单元中有以下内容:
template<typename T>
T my_data{};
inline void test() {
my_data<int> = 1;
}
每个翻译单元将被赋予它们自己的my_data 定义,从而产生多个符号,或者它们会在程序中有效地合并到一个定义中,其中在一个翻译单元中调用test() 将修改变量为另一个翻译单位?
标准中哪里提到了这种行为?
【问题讨论】:
-
这看起来像是this question的更通用版本
-
是否有您关心的特定 C++ 版本(如 C++17?),或者每个版本都支持变量模板?
-
C++14 特别是,但我假设它对于任何支持变量模板的解释都是相同的。我试图弄清楚我正在做的事情是否属于 NDR ......但该程序似乎在 Clang 下表现正确。