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

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

#include <iostream>

template<typename T>
T n;

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

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

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

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

template<typename T> T n{};

тогда clang ++ тоже связывает это.

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

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

1 ответ

Решение

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

Другие вопросы по тегам