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

Рассмотрим приведенный ниже код:

#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, код должен быть связан.

Ответ 1

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