如果这段代码无效,那就太好了。但它在概念上是合理的,而且是海湾合作委员会 接受它 尽管Comeau没有:
template< typename > struct t;
template<> struct t< int > {} r; // Bad declarator! Don't pee on the carpet!
(编辑: 以上编译但是 r
似乎没有被宣布 进入任何范围,所以它基本上被忽略了。)
显式特化在模板和类之间填充一种下层区域。一旦定义,显式特化声明的类型就完成了。从编译器的角度来看,它不是模板。如果它是参数化模板,则无法声明对象。考虑§14/ 3:
在模板声明,显式特化或显式实例化中,声明中的init-declarator-list最多应包含一个声明符。当这样的声明用于声明类模板时,不允许声明者。
“用于声明类模板”是什么意思?显然,主模板声明了一个类模板。根据§14.5.5/ 1(FDIS编号),部分专业化也是如此:
类模板名称是simple-template-id的模板声明是simple-template-id中指定的类模板的部分特化。
然而,当谈到显式专业化时,标准就是在令牌序列之前的声明方面说话 template<>
。它 容貌 像模板一样,它命名一个模板名称,但它似乎没有声明模板。
真正奇怪的是§14/ 3将声明者的数量限制为“最多一个”。函数模板声明,显式特化或实例化必须只有一个声明符。涉及类模板的任何声明必须具有正确的零...除了显式特化,这似乎是通过裂缝。忠实于海湾合作委员会 拒绝允许
template<> struct t< int > {} r, s; // Offer valid one per specialization.
我倾向于同意海湾合作委员会的解释,尽管可能是胡说八道。不幸的是,它可能是 抑制 它能够检测缺失的分号。请允许声明者的数量正好为零!