Является ли этот метод для прямого объявления переменной шаблона допустимым?

В приведенном ниже коде приведен пример прямого объявления константных переменных шаблона, которые компилируются как в clang, так и в gcc:

template<class T>
extern const T value;
template<class T>
const T value= 0;

auto test = value<int>;

template<class T>
extern const T value2;
template<class T>
constexpr T value2 =0;

auto test2 = value2<int>;

template<class T>
extern const T value3;
template<class T>
inline constexpr T value3 =0;

auto test3 = value3<int>;

Тем не менее, если я объявляю переменные не const, gcc выдает ошибку компоновщика:undefined reference to value4<int> а также undefined symbol value5<int>, но Clang принимает код:

template<class T>
extern T value4;
template<class T>
T value4= 0;

auto test4 = value4<int>; //gcc linker error

template<class T>
extern T value5;
template<class T>
inline T value5=0;

auto test5 = value5<int>; //gcc linker error

Первоначально я был уверен, что все те случаи использования, когда стандарт соответствует. Но поскольку gcc выдает ошибку компоновщика для последних двух случаев, мне было интересно, были ли какие-либо из этих предварительных объявлений законными? GCC не так или я нахожусь на Диагностика не требуется ошибка? Может ли предварительное объявление с последующим встроенным определением шаблонных переменных как value3 или же value5 в многократном переводе блок вызывает нарушение одр?

Связь фазовой ошибки с демонстрацией


Примечание: в этом ответы на эти вопросы кажется, они упустили возможность объявить переменную как extern const.

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]