Должна ли переменная шаблона C-array полная специализация указывать размер массива? - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь реализовать шаблонный массив 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 ++?Какой компилятор правильный?

...