在C++ 11标准中它禁止'template <typename T> class A {...}; template <typename T> class A <int> {...};' (如果有的话)?

Dan*_*aum 5 c++ templates language-lawyer c++11

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

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

// phony "specialization"
template <typename T>
class A<int>
{...};
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*ely 3

令我感到非常惊讶的是,14.5.5 [temp.class.spec] 中没有明确声明类模板部分特化的所有模板参数都必须在模板参数列表中使用。这将变得template<class T> class A<int>无效,因为T在 template-argument-list 中未使用<int>

我认为你的虚假专业化只是隐式无效,因为你永远无法匹配它,所以它永远无法使用。如果您实例化A<int>,则它与主模板匹配。它无法与您的专业化相匹配,因为它有一个额外的模板参数 ,T无法推断出(您建议可以通过说来提供它,A<int><double>但这不是有效的 C++ 语法,所以没有帮助)。

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