模板变量 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 开始,此问题已得到修复。
我正在尝试实现一个模板化的 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 开始,此问题已得到修复。