Ошибка компоновщика с шаблонами переменных

Рассмотрим код ниже:

#include <iostream>

template<typename T>
T n;

int main()
{
    n<int> = 42;
    std::cout << n<int> << std::endl;
}

Он компилирует и связывает с g++5.1 и отображает 42. Однако clang++ не может связать его:

неопределенная ссылка на n‹int›

Если я инициализирую переменную шаблона, например

template<typename T> T n{};

затем clang++ также связывает его.

Есть идеи, что происходит? Является ли clang ++ «правильным» в невозможности связать программу? И почему это работает, если я инициализирую переменную шаблона?

Насколько мне известно, переменные шаблона — это просто синтаксический сахар для оберток шаблона вокруг статических членов, поэтому n<int> = 42 фактически специализируется на экземпляре int. ИМО, код должен ссылаться.


person vsoftco    schedule 17.06.2015    source источник
comment
Похоже на llvm.org/bugs/show_bug.cgi?id=22825.   -  person dyp    schedule 17.06.2015
comment
@dyp Я согласен, это похоже на проблему.   -  person JKor    schedule 17.06.2015
comment
Это действительно так. @dyp публикует ответ, а не комментарий!!   -  person Lightness Races in Orbit    schedule 17.06.2015


Ответы (1)


Это ошибка в clang++ #22825. Отчет об ошибке был подан 2015-03-06, и ошибка еще не исправлена. Ричард Смит полагает, что это определение неправильно трактуется только как предварительная декларация.

person dyp    schedule 17.06.2015
comment
Извините, но у меня больше нет информации об этой ошибке. У меня может быть некоторое время позже, чтобы изучить источники clang. - person dyp; 17.06.2015