模板变量 C 数组完全特化是否应该指定数组大小?

Should template variable C-array full specialization specify array size?

我正在尝试实现一个模板化的 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 };

我在 Visual Studio 2017 中使用 MSVC 编译器,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++ 吗?哪个编译器是正确的?

这是由于 MSVC 编译器的一个错误:https://developercommunity.visualstudio.com/t/compiler-error-c2133-unknown-size-for-constant-tem/228098。 从带有 Visual Studio 16.10.1 的 MSVC 开始,此问题已得到修复。