この回答は、標準段落の抽象構文ツリーの不適切な解析に基づいています。「標準に戻る」セクションで仮定した条件のグループ化は、意図したものではないことが判明しました。意図したグループ化は、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
を意味します。
Ti
Ui
( 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) は冗長です。