在C ++ 11标准中它禁止&#39; template <typename t =“”> A类{...}; template <typename t =“”> class A <int> {...};&#39; (如果在任何地方)?</int> </typename> </typename>

时间:2014-12-16 03:25:06

标签: c++ templates c++11 language-lawyer

我试图通过想象奥术结构来更全面地掌握模板语法和语义。我相信C ++ 11标准不允许使用以下语法:

template <typename T>
class A
{...};

// phony "specialization"
template <typename T>
class A<int>
{...};

但是,我无法在C ++ 11标准中找到不允许使用此语法的内容。

我是否认为C ++ 11标准不允许显示的语法?如果是这样,哪里可以发现不允许语法?

1 个答案:

答案 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 ++语法,所以没有没帮助。

我已经要求标准委员会澄清为什么你的假专业化是无效的(显然它是,但我看不出它在哪里这么说)。