Рассмотрим код ниже:
#include <iostream>
template<typename T>
T n;
int main()
{
n<int> = 42;
std::cout << n<int> << std::endl;
}
Это компилирует и связывает с g ++ 5.1, и это отображает 42
, Тем не менее, лязг ++ не может связать это:
неопределенная ссылка на n<ИНТ>
Если я инициализирую переменную шаблона как
template<typename T> T n{};
затем Clang ++ связывает это тоже.
Есть идеи, что происходит? Является ли clang ++ «правильным» при невозможности связать программу? И почему это работает, если я инициализирую переменную шаблона?
Насколько я знаю, переменные шаблона являются просто синтаксическим сахаром для обертки шаблона вокруг статических членов, поэтому n<int> = 42
эффективно специализируется на int
пример. ИМО, код должен ссылаться.
Это ошибка в Clang ++ # 22825. Отчет об ошибке был подан 2015-03-06, и ошибка еще не исправлена. Ричард Смит предполагает, что это определение неправильно трактуется только как предварительное заявление.