模板变量 C 数组完全专业化是不是应该指定数组大小?
Posted
技术标签:
【中文标题】模板变量 C 数组完全专业化是不是应该指定数组大小?【英文标题】:Should template variable C-array full specialization specify array size?模板变量 C 数组完全专业化是否应该指定数组大小? 【发布时间】:2019-07-22 00:58:27 【问题描述】:我正在尝试实现一个模板化的 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
添加到完整专业化可以解决错误。但是,它在带有-pedantic
标志的Ubuntu g++ 8.1.0 下编译。
在我看来,函数和类的完全特化就像定义了一个非模板版本,所以我想这也应该适用于变量模板,并且上面的完全特化可以等同于(除了名称)
constexpr float arr_with_a1_and_b0[] = 3.0f ;
这对我来说看起来很有效,因为大小应该从列表初始化(聚合初始化)中推导出来。
我的问题是:上面的代码是有效的 C++ 吗?哪个编译器是正确的?
【问题讨论】:
你在课堂上定义专业化吗?标准存在缺陷:open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#727 @NN_ 感谢您的信息!不,特化是在命名空间范围内定义的。 似乎是 MSVC 中数组专业化的一些问题。查看此报告的错误:developercommunity.visualstudio.com/content/problem/176842/… @P.W 我刚刚找到了准确描述问题的线程:developercommunity.visualstudio.com/content/problem/228098/… 【参考方案1】:这是由于 MSVC 编译器存在错误:https://developercommunity.visualstudio.com/t/compiler-error-c2133-unknown-size-for-constant-tem/228098。 从带有 Visual Studio 16.10.1 的 MSVC 开始,此问题已得到修复。
【讨论】:
以上是关于模板变量 C 数组完全专业化是不是应该指定数组大小?的主要内容,如果未能解决你的问题,请参考以下文章