在C ++ 11草案14.8.2.4p10,有被写入
如果对每种类型被认为给定模板至少为一体的专业化所有类型和更专业化一些集的类型和其他模板不会更专业化的任何类型或不是任何类型的,那么给出至少为一体的专业化模板比其他模板更加专业化。
为什么会出现“或至少不作为专门用于任何类型的”? 至于我可以看到,如果我们有一个类型列表
T1, T2, T3
U1, U2, U3
如果所有的TS至少为一体的专业化和一些更加专业化。 而没有我们的是更专业的,那么在我看来,它遵循的集合T作为一个整体比集合U的,从逻辑上来说更加专业化。 为什么会有那么对于在没有我们的比相应的TS至少为一体的专业化提到后备?
更新:现在这已被添加为一个正式的C ++问题
我终于想通了如何阅读有问题的段落。 下面我就符号
如果对每种类型被认为给定模板至少为一体的专业化所有类型,并
- 更专业化一些集的类型和其他模板是不是更专业化的任何类型或
- {另一个模板}未至少为专门用于任何类型的,
然后给定的模板比其他模板更加专业化。
这样,下面的第一个模板也比第二模板更加专业化
template<typename T> void f(T*);
template<typename T> void f(T);
需要注意的是,第一个模板的参数至少与专业作为第二模板,但不定义为“更专业化” - 这个词只适用于其中两个参数是引用和有条件限制(见第14.8 9的情况。 2.4)。 这些规则显然不是为了遵循任何正式的订货法律。 第二个模板是不是至少为专门为第一个模板。 这意味着,第二项应用,而不是第一个。
这个答案是基于标准款的抽象语法树的不正确的解析。 在“回到标准”部分假设条件的分组竟然不被预期的一个。 预期的分组是一个约翰内斯·绍布在他的回答显示。
为什么会有那么对于在没有我们的比相应的TS至少为一体的专业化提到后备?
我同意你说的第二部分(实际上,整个第二个条件)是多余的。
参考一些词汇:
让我们有一些乐趣的逻辑和介绍两个模板一对相应的参数之间的三个基本关系:
- 更专业的比 :对于参数
Ti
和Ui
分别,一个模板匹配等,但反之则不然。 我将表明这是Ti < Ui
; - 同样的专业 :为参数
Ti
和Ui
分别,一个模板匹配等,反之亦然。 我将表明这是Ti == Ui
; - 专业化-无与伦比的 :对于参数
Ti
和Ui
分别, 没有一个模板匹配其他为特定参数。 我将表明这是T1 ~ U1
。
例如,在下面的代码片段:
template<typename X> struct A { };
template<typename X> struct B { };
template<typename X> void foo(A<X>, X, A<X>) { } // 1
template<typename X> void foo(X, X, B<X>) { } // 2
对于第一个参数,(1)比更特化的( <
)(2); 为第二个参数,(1)同样专门为(或“专门的 ”, ==
)(2); 对于第三个参数,(1)是专业化-无法比拟的( ~
)(2)。
而让我们现在定义一个派生关系:
- 的模板(1) 至少为专门作为另一模板(2)的各个参数
Ti
和Ui
时(Ti < Ui)
或(Ti == Ui)
时,即当或者(1)比更特化的(2)或(1)是为专门为(2)。 在上面的例子,因此, T1 <= U1
, T2 <= U2
,和U2 <= T2
。
回到标准:
与一对夫妇括号的帮助下,所述引用上述成为(A &&(B1 || B2)):
[...]对于每种类型的被考虑:
(给定模板至少为一体的专业化所有类型和更专业化一些类型集合)
AND
(其他的模板是不是更专业化的任何类型
OR
是不是至少为专门用于任何类型)
给定两个模板相对于被命令参数类型的相应序列T1, ..., Tn
和U1, ..., Un
,条件(A):
[...]给定模板至少为一体的专业化所有类型和更专业化一些类型集合[...]
意味着对于每个i = 1..n
, Ti <= Ui
,并且对于一些j
以s 1..n
,它适用的更严格的条件,即Tj < Uj
。 删除索引i
,这意味着对于每个参数:
(T < U) || (T == U) // (A)
这种情况被置于逻辑积(“与”)与另一种状态(B),它是依次的两个子条件的逻辑或(“或”),(B1)和(B2)。 让我们开始研究副条件(B1):
[...]其他模板为任何类型的不专业[...]
这意味着对于任何i
,它是从未的情况下Ui < Ti
,这意味着,或者:
-
Ti
比更专门Ui
( Ti < Ui
); 要么 -
Ti
和Ui
都同样专业( Ui == Ti
); 要么 -
Ti
和Ui
是专业化,无与伦比( Ui ~ Ti
):
更正式地说:
!(U < T) <==> (T < U) || (T == U) || (T ~ U) // (B1)
现在让我们看看第二子条件(B2),其被置于逻辑和与(B1):
[...]是不是至少为专门用于任何类型的[...]
这是否定U <= T
,这意味着:
!(U <= T) <==> !((U == T) || (U < T)) ==> !(U == T) && !(U < T)
因此,换句话说, T
和U
是同样的,专门的,也不U
比更专业的T
。 因此,唯一剩下的可能性是:
(T < U) || (T ~ U) // (B2)
现在显而易见的是,(B2)意味着(B1),因为(B2)是更限制性的。 因此,它们的间断(B)将与(B1)和(B2)相一致是多余的:
(T < U) || (T ~ U) || (T == U) // (B)
但是,什么是也很明显,这里要说的是(A)比(B)严格,所以(A)和(B)的结合等同于(A)。
结论:
全条件(B)是多余的。
文章来源: When is a template more specialized than the other? 'And'/'Or' confusion with logics.