C++显式特化中限制declaration合法范围的规范性规则位于何处?
关于显式特化(explicit specialization)的语法规则
explicit-specialization的语法定义为:
template < >declarationdeclaration的语法定义包含以下类别:
- block-declaration
- nodeclspec-function-declaration
- ...
- explicit-instantiation
- ...
从语法定义来看,declaration可以是任何语法上合法的声明,参考以下示例代码:
template<class T> struct A{ template<class Y> struct B{}; }; template<> template struct A<int>::B<int>; //declaration: explicit-instantiation
但GCC和Clang均无法识别该语法,请问限制显式特化中的declaration不可为显式实例化的规则在C++标准中的哪一部分?
回答
该限制出自C标准的[temp.expl.spec](显式特化)章节,所有正式发布的C标准版本(C11至C23)均有相同约束:
- 语法规则中
declaration包含显式实例化只是泛化的语法结构定义,标准在语义层面额外要求:template<>引导的显式特化声明,对应的声明对象必须是可特化的模板实体(类模板、函数模板、变量模板、模板成员、成员模板等)。 - 显式实例化是独立的编译指令,作用是触发编译器生成对应模板的默认实例,本身不属于特化声明范畴,自然不允许出现在显式特化的语法结构中。
你给出的示例代码逻辑上本身也存在冲突:既要求为A<int>::B<int>声明自定义特化,又要求编译器自动实例化默认版本,二者互斥,因此GCC、Clang都会报错。
内容的提问来源于stack exchange,提问作者xmh0511
相关产品推荐
相关产品推荐

