【发布时间】: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/…
标签: c++ language-lawyer c++17 list-initialization template-variables