Как указано в документе (выделено мной):
Любое из следующих имен, объявленных в области имен, имеет внутреннюю связь :
- энергонезависимый не шаблон не встроенный переменные, соответствующие константам (включая 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
Второй столбец для constVar
, и он отличается для разных строк(напечатано из разных переводческих единиц). Это заставляет меня думать, что оно на самом деле имеет внутреннюю связь, несмотря на то, что это шаблон.
Я понимаю, что нарушаю ODR, но только для того, чтобы понять, что происходит.
Так же, как и у constVar
внутренняя связь? Если да, что означает выделенный фрагмент документа? Если нет, то что происходит и зачем нам этот выделенный фрагмент?