Я пытаюсь реализовать шаблонный массив C со специализацией следующим образом:
// template definition
template< int a, int b > constexpr int arr[] = { 1 };
// partial specialization, works ok
template< int b > constexpr double arr<0, b>[] = { 2.0 };
// full specialization, compile error in MSVC, ok in g++
template< > constexpr float arr<1, 0>[] = { 3.0f };
Я использую компилятор MSVC с Visual Studio 2017 со стандартом C ++, установленным на C ++ 17, икомпилятор жалуется, что C2133: 'arr<1,0>': unknown size
, поэтому добавление размера 1
к полной специализации устраняет ошибку.Тем не менее, он компилируется под Ubuntu g ++ 8.1.0 с включенным флагом -pedantic
.
На мой взгляд, полная специализация на функциях и классах действует так, как если бы была определена не шаблонная версия, поэтому я думаю, что это должно такжеприменить к шаблону переменной, и приведенная выше полная специализация может быть эквивалентна (кроме имени)
constexpr float arr_with_a1_and_b0[] = { 3.0f };
, что для меня выглядит вполне корректно, поскольку размер следует выводить из инициализации списка (агрегат-инициализация).
Мой вопрос: допустим ли приведенный выше код C ++?Какой компилятор правильный?