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