В приведенном ниже коде приведен пример прямого объявления константных переменных шаблона, которые компилируются как в 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.
Задача ещё не решена.
Других решений пока нет …