模板变量 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&lt;1,0&gt;': 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 数组完全专业化是不是应该指定数组大小?的主要内容,如果未能解决你的问题,请参考以下文章

C语言怎样定义变长数组

IDL中如何定义 动态数组?

当数组未完全填充时,内存中分配了什么? ( C )

C 语言数组 ( 数组本质 | 数组长度定义 | 数组初始化 | 编译时初始化 | 显式初始化 - 重置内存 )

C语言字符串常量,字符数组占内存大小问题?

C语言数组寻址