我试图通过想象神秘的结构来更全面地掌握模板语法和语义。我认为 C++11 标准不允许使用以下语法:
template <typename T>
class A
{...};
// phony "specialization"
template <typename T>
class A<int>
{...};
但是,我在 C++11 标准中找不到不允许使用此语法的地方。
C++11 标准不允许显示的语法是否正确?如果是这样,在哪里可以找到不允许的语法?
让我感到非常惊讶的是,14.5.5 [temp.class.spec] 中没有明确声明类模板部分特化的所有模板参数都必须在模板参数列表中使用。那会让template<class T> class A<int>
无效,因为T
未在模板参数列表中使用<int>
.
我认为你的虚假专业化只是隐式无效,因为你永远无法匹配它,所以它永远无法使用。如果你实例化A<int>
那么它就与主模板相匹配。它无法匹配您的专业化,因为它有一个额外的模板参数,T
,无法推断出(您建议可以通过说来提供A<int><double>
但这不是有效的 C++ 语法,所以没有帮助)。
我已要求标准委员会澄清为什么你的虚假专业化是无效的(显然是无效的,但我看不到它在哪里这么说)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)