この回答は、標準段落の抽象構文ツリーの不適切な解析に基づいています。「標準に戻る」セクションで仮定した条件のグループ化は、意図したものではないことが判明しました。意図したグループ化は、Johannes Schaub が回答で示したものです。
では、対応する Ts ほど専門化された Us がいない場合に、前述のフォールバックがあるのはなぜですか?
2 番目の部分 (実際には、2 番目の条件全体) が冗長であることに同意します。
参考になる語彙:
ロジックを楽しんで、対応するパラメーターのペアに対する 2 つのテンプレート間の 3 つの基本的な関係を紹介しましょう。
- より特殊化: パラメータ
TiとUiそれぞれについて、1 つのテンプレートが他のテンプレートと一致しますが、その逆はありません。これを次のように示しますTi < Ui。
- 同様に特殊化されています : パラメータ
TiとUiそれぞれについて、一方のテンプレートが他方のテンプレートと一致し、その逆も同様です。これを次のように示しますTi == Ui。
- Specialization-incomparable : パラメータ
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)よりも特殊化されています。2 番目のパラメーターについては、(1) は (または "" と同じように特殊化されています)== (2) と同様に特殊化されています。~3 番目のパラメーターの場合、(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パラメータ タイプおよびの対応するシーケンスに関して順序付けされる 2 つのテンプレートが与えられた場合U1, ..., Un、条件 (A):
[...] 与えられたテンプレートは、少なくともすべてのタイプに特化しており、いくつかのタイプのセットに特化しています [...]
i = 1..nは、 、Ti <= Ui、および の一部jの に対して1..n、 というより厳しい条件を適用することを意味しTj < Ujます。index を削除するiと、これは各パラメーターについて次のことを意味します。
(T < U) || (T == U) // (A)
この条件は、別の条件 (B) との論理積 (「and」) に入れられます。これは、2 つのサブ条件 (B1) と (B2) の論理和 (「or」) です。サブ条件 (B1) の検討を始めましょう。
[...] 他のテンプレートは、どのタイプにも特化していません [...]
これは、どの についてもi、次のいずれかを意味することは決してないことUi < Tiを意味します。
TiUi( Ti < Ui)よりも専門的です。また
TiとUi同様に専門化されています ( Ui == Ti)。また
TiとUi比較できない特殊化 ( Ui ~ Ti):
より正式には:
!(U < T) <==> (T < U) || (T == U) || (T ~ U) // (B1)
次に、(B1) との論理和である 2 番目のサブ条件 (B2) を見てみましょう。
[...] 少なくともどのタイプにも特化されていません [...]
これは の否定であり、次のU <= Tことを意味します。
!(U <= T) <==> !((U == T) || (U < T)) ==> !(U == T) && !(U < T)
つまり、TとUは同等に専門化されているわけでも、Uよりも専門化されているわけでもありませんT。したがって、残された唯一の可能性は次のとおりです。
(T < U) || (T ~ U) // (B2)
(B2) はより制限的であるため、(B2) が (B1) を意味することは明らかです。したがって、それらの論理和 (B) は (B1) と一致し、(B2) は冗長です。
(T < U) || (T ~ U) || (T == U) // (B)
しかし、ここで明らかなことは、(A) は (B) よりも厳密であるため、(A) と (B) の接続詞は (A) と同等です。
結論:
条件全体 (B) は冗長です。