正如医生所说(强调我的):
在命名空间范围内声明的以下任何名称都具有内部链接:
- 非易失性非模板非内联const 限定变量(包括 constexpr),未声明为 extern 且先前未声明为具有外部链接;
所以我希望 const 模板变量具有外部链接。所以我做了一个测试:
// 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
第二列是 for constVar
,并且对于不同的行(从不同的翻译单元打印)有所不同。这让我认为它实际上具有内部链接,尽管它是一个模板。
我知道我确实违反了 ODR,但只是为了了解正在发生的事情。
那么constVar
实际上有内部联系吗?如果是,文档中突出显示的片段是什么意思?如果不是,那么发生了什么,为什么我们需要这个突出显示的片段?