Должна ли переменная шаблона C-array полная специализация указывать размер массива?

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

1 ответ

Это произошло из-за ошибки компилятора MSVC: https://developercommunity.visualstudio.com/t/compiler-error-c2133-unknown-size-for-constant-tem/228098 . Начиная с MSVC с Visual Studio 16.10.1, эта проблема исправлена.

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