正如the doc所说(强调我的意思):

因此,我希望const模板变量具有外部链接。所以我did a test:

// main.cpp
void other();

template<class T> T var = 1;
template<class T> const T constVar = 1;

int main() {
  std::cout << var<int> << ' ' << constVar<int> << std::endl;
  other();
}

// other.cpp
template<class T> T var = 2;
template<class T> const T constVar = 2;

void other() {
  std::cout << var<int> << ' ' << constVar<int> << std::endl;
}
输出为:
1 1
1 2
第二列用于constVar,并且对于不同的行(从不同的翻译单位打印)有所不同。这使我认为,尽管它是一个模板,但它实际上具有内部链接。
我了解我确实违反了ODR,但仅是了解正在发生的事情。
那么constVar实际上具有内部链接吗?如果是,文档中突出显示的片段是什么意思?如果否,那么发生了什么,为什么我们需要这个突出显示的片段?

最佳答案

C++14 N4296 §14.4



C++14 N4296 §3.2.6



模板是隐式内联的,即具有外部链接。
发生了什么=未定义的行为。
不需要编译器来诊断您的代码,并且可能会产生意外/不一致的结果。

10-06 12:44