Как говорится в документе (выделено мной):
Любое из следующих имен, объявленных в области пространства имен, имеет внутреннюю связь:
- энергонезависимые не шаблонные неинлайновые переменные с указанием константы (включая constexpr), которые не объявлены extern и ранее не объявлены как имеющие внешнюю связь;
Поэтому я ожидаю, что константные переменные шаблона будут иметь внешнюю связь. Итак, я провел тест:
// 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
имеет внутреннюю связь? Если да, то что означает выделенный фрагмент документа? Если нет, то что происходит и зачем нам этот выделенный фрагмент?
constVar
имеет внутреннюю связь, то есть абзац кажется примененным - person Mikhail   schedule 29.10.2019&constVar<int>
. - person aschepler   schedule 30.10.2019