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