为什么此模板代码不选择部分专业化?

时间:2018-07-17 19:34:06

标签: c++ templates partial-specialization non-type

我有以下代码,我对为什么不选择专业化感到困惑。

sudo nano /etc/paths 

P.S。我不确定我是否对该模板进行了专门的调整,但可以对其进行编译,因此我认为它可能还不错。

1 个答案:

答案 0 :(得分:1)

代码格式不正确,编译器应报告错误。用于非类型引用模板参数的参数必须为(C ++ 17 14.3.2)

  

一个常数表达式(5.19),它指定具有静态存储持续时间并具有外部或内部链接的完整对象的地址,或者具有外部或内部链接的函数的地址

如果一个对象可以从同一翻译单元中的其他范围进行引用,则具有内部链接;如果可以从同一翻译单元和其他翻译单元中的其他范围进行引用,则具有外部链接。模板参数arr在主函数的范围内声明,并且仅在该范围内可见,因此没有链接,并且不应与任何模板匹配。

当我在计算机上安装的编译器上尝试使用clang(6.0.0-1ubuntu2)时,该问题的行为与问题相同,而gcc(7.3.0-16ubuntu3)报告说arr是一个没有连锁。如果我将arr移到函数范围之外(因此给它外部链接),则两个编译器都会接受代码并给出预期的结果。