我试图通过想象奥术结构来更全面地掌握模板语法和语义。我相信C ++ 11标准不允许使用以下语法:
template <typename T>
class A
{...};
// phony "specialization"
template <typename T>
class A<int>
{...};
但是,我无法在C ++ 11标准中找到不允许使用此语法的内容。
我是否认为C ++ 11标准不允许显示的语法?如果是这样,哪里可以发现不允许语法?
答案 0 :(得分:3)
我很惊讶14.5.5 [temp.class.spec]中没有明确的声明说必须在template-argument-list中使用类模板部分特化的所有模板参数。这会使template<class T> class A<int>
无效,因为T
未在模板参数列表<int>
中使用。
我认为你的假专业化只是隐含无效,因为你永远无法匹配它,所以它永远不会被使用。如果您实例化A<int>
,那么它与主模板匹配。它无法与您的专业化相匹配,因为它有一个额外的模板参数T
,无法推断出来(您建议可以通过说A<int><double>
来提供,但这不是有效的C ++语法,所以没有没帮助。
我已经要求标准委员会澄清为什么你的假专业化是无效的(显然它是,但我看不出它在哪里这么说)。