ISO C ++ - 在模板中声明是否合法 - 数组或函数参数?

时间:2015-03-24 12:43:16

标签: c++ templates parameters language-lawyer c++14

我想知道是否允许这样的模板构造:

template<typename T, T arr[4]>

template<typename T, T func(void)>

最新的ISO C ++ 14草案第14.1.4节中的第一个州:

ISO C++ quote 0

正如您所看到的,上面的列表显示了模板参数允许的类型,其中没有“函数”或“数组”。然而,最近在§14.1.8我们有这个(即使引用的例子):

ISO C++ Quote 1

所以问题是 - 编译器是否允许这样的结构?或者这是一个草稿 - 有人可以将它与原始版本进行比较,并说它是否相同?也许有问题。

编辑:我要的是标准纸。它的写法是否被叛逃?

我个人认为,在任何情况下都不应允许这种愚蠢和混乱的结构。特别是在C ++模板中。

2 个答案:

答案 0 :(得分:1)

非类型模板参数调整的规则正是函数参数的规则,如C ++ 14/11 [dcl.fct] / 5(C ++ 03 [dcl] .fct] / 3)。同样,数组和函数类型的函数参数调整规则直接从C(C11 6.7.6.3/7; 8)继承。

在语言演变的这个阶段更改规则会导致与现有代码的不兼容,使用以前版本的语言,使用函数参数的规则,或者如果这些规则也被更改,则使用C,并且效果不大除了理顺一种语言的小怪癖外。

如果你想看到这个用法被弃用,我会建议在gcc和/或clang中添加一个警告,用于模板和/或函数参数数组到指针和函数到指针的转换。这个警告尚未存在这一事实表明,大多数程序员不会就此结构分享您的意见。

答案 1 :(得分:1)

  

我想知道是否允许这样的模板构造

是的,根据您引用的条款。在第8节中,类型被调整为指针,这是第4条允许的。

  

编译器是否允许这样的结构?

是的,因为标准说它必须。

如果你问的是标准是否应该允许这些:是的,因为更改它会破坏现有的有效代码。

  

或者这是一个草稿 - 有人可以将它与原始版本进行比较并说明它是否相同?

我没有已发布的C ++ 14标准,但在this draft中它是相同的,我相信它比标准更新。 C ++ 11及更早版本的标准指定了相同的类型调整。

  

我个人认为,在任何情况下都不应允许这种愚蠢和混乱的结构。

它们在C中更有意义,这种转换很常见(显然我的意思是对于函数参数,而不是模板参数,因为C没有模板)。在C ++中,通常可以通过更高级别的抽象(std::array和仿函数)来避免混淆,如果有人知道自己在做什么,就应该只使用原始数组和指针。

人们可以提出弃用C ++中的转换的论据,因为它们可能有点令人困惑,并且几乎没有可读性的好处而不是证明它们在C中的存在。但是这将是高度自以为是的,并且在这里是偏离主题的。