14

C++11 ドラフトの 14.8.2.4p10 には、

考慮されている型ごとに、特定のテンプレートが少なくともすべての型に特化しており、一部の型のセットに特化しており、もう一方のテンプレートがどの型にも特化していないか、少なくともどの型にも特化していない場合、指定されたテンプレートは、他のテンプレートよりも特化されています。

「または少なくともどのタイプにも特化されていない」があるのはなぜですか? 私が見る限り、タイプのリストがある場合

T1, T2, T3
U1, U2, U3

そして、すべての T が少なくとも同程度に専門化されており、一部がより専門化されている場合。そして、私たちのどれもより専門化されていないので、論理的に言えば、T の集合は全体として U の集合よりも専門化されているように思われます。では、対応する Ts ほど専門化された Us がいない場合に、前述のフォールバックがあるのはなぜですか?

4

2 に答える 2

7

更新: これは公式の C++ の問題として追加されました。


問題の段落の読み方がようやくわかりました。以下に箇条書きにしました

考慮される各タイプについて、特定のテンプレートが少なくともすべてのタイプに特化されている場合、および

  • 一部のタイプのセットに特化しており、他のテンプレートはどのタイプにも特化していない、または
  • {the other template} は、少なくともどのタイプにも特化されていません。

その場合、指定されたテンプレートは他のテンプレートよりも特化されています。

このようにして、次の最初のテンプレートも 2 番目のテンプレートよりも特化されています。

template<typename T> void f(T*);
template<typename T> void f(T);

最初のテンプレートのパラメーターは、少なくとも 2 番目のテンプレートと同じくらい特殊化されていますが、「より特殊化された」とは定義されていないことに注意してください。この用語は、両方のパラメーターが参照であり、特定の条件が適用される場合にのみ適用されます (14.8.8 の段落 9 を参照)。 2.4) . ルールは、正式な順序付け法に従うことを意図していないようです。2 番目のテンプレートは、少なくとも最初のテンプレートほど特殊化されていません。これは、最初の箇条書きではなく、2 番目の箇条書きが適用されることを意味します。

于 2013-03-29T20:24:08.557 に答える
6

この回答は、標準段落の抽象構文ツリーの不適切な解析に基づいています。「標準に戻る」セクションで仮定した条件のグループ化は、意図したものではないことが判明しました。意図したグループ化は、Johannes Schaub が回答で示したものです。


では、対応する Ts ほど専門化された Us がいない場合に、前述のフォールバックがあるのはなぜですか?

2 番目の部分 (実際には、2 番目の条件全体) が冗長であることに同意します。


参考になる語彙:

ロジックを楽しんで、対応するパラメーターのペアに対する 2 つのテンプレート間の 3 つの基本的な関係を紹介しましょう。

  • より特殊化: パラメータTiUiそれぞれについて、1 つのテンプレートが他のテンプレートと一致しますが、その逆はありません。これを次のように示しますTi < Ui
  • 同様に特殊化されています : パラメータTiUiそれぞれについて、一方のテンプレートが他方のテンプレートと一致し、その逆も同様です。これを次のように示します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 <= U1T2 <= 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)よりも専門的です。また
  • TiUi同様に専門化されています ( Ui == Ti)。また
  • TiUi比較できない特殊化 ( 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)

つまり、TUは同等に専門化されているわけでも、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) は冗長です。

于 2013-03-29T15:51:52.660 に答える