【发布时间】:2015-08-31 21:30:50
【问题描述】:
N4527 14.5.5.1[temp.class.spec.match]
2 如果部分特化的模板参数可以从实际模板参数列表中推导出来,则部分特化匹配给定的实际模板参数列表。
template<class T1, class T2, int I> class A { }; // #1 template<class T, int I> class A<T, T*, I> { }; // #2 template<class T1, class T2, int I> class A<T1*, T2, I> { }; // #3 template<class T> class A<int, T*, 5> { }; // #4 template<class T1, class T2, int I> class A<T1, T2*, I> { }; // #5 A<int, int, 1> a1; // uses #1 A<int, int*, 1> a2; // uses #2, T is int, I is 1 A<int, char*, 5> a3; // uses #4, T is char A<int, char*, 1> a4; // uses #5, T1 is int, T2 is char, I is 1 A<int*, int*, 2> a5; // ambiguous: matches #3 and #53 非类型模板实参也可以从主模板的非类型形参的实际模板实参的值推导出来。 [例子:上面
a2的声明。 —结束示例]4 在引用类模板特化的类型名称中(例如,
A<int, int, 1>),参数列表应 匹配主模板的模板参数列表。特化的模板参数是 从主模板的参数推导出来。
在规则3中,示例显示I是从第三个实际模板参数1推导出来的,这就是规则2所说的。所以作为rule4的第二句,我认为它是在重复rule2所说的。
它们之间有什么区别(rule2、rule3和rule4)?
也就是说,我们已经有了rule2,rule3和rule4第二句的意图(意义)是什么,为什么会出现在这里?
【问题讨论】:
-
显然这个措辞已经出现在long time。
-
@TemplateRex 我认为规则 4 的第一句话说,在引用类模板特化的类型名称中,参数列表不能使用部分特化的模板参数列表,它应该匹配主模板的模板参数列表。例如
A<int,1> a2是错误的。对于第二句,我不知道它和规则2的区别。 -
我会说规则 3 是对规则 2 的澄清。它所说的 规则 2 不仅适用于类型,也适用于非类型模板参数。规则 2 隐含地包含“非类型模板参数”,但规则 3 明确指出。
-
@EugeneZavidovsky 也许使用 simple-template-id 作为 A 并使用 template-name 后跟隐式模板参数列表作为 P,使用规则 14.8 .2.5 [temp.deduct.type]。例如
A<int, int*, 1> a2;A<int, int*, 1>作为 A,A<T1, T2, I>作为 P。
标签: c++ templates language-lawyer