問題タブ [partial-ordering]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ テンプレート: 可変個引数クラス テンプレートの最後のテンプレートと一致できません
私はC++ 11可変引数テンプレートを学習しており、テンプレート構造体を作成して、特定のリストの最大数を計算し、試しました:
しかし、g ++は不平を言います:
事前に簡単な宣言を追加することで実行できます。
上記の最初のテンプレートを次のように変更します。
私は cppreference: https://en.cppreference.com/w/cpp/language/partial_specialization#Partial_orderingを参照しまし たが、私の場合の有用な説明が見つかりません。
max<a>
この問題は、テンプレート パラメータが 1 つしかない最後のテンプレート ( ) が原因である可能性があります。これは、プライマリ テンプレートの特別なバージョンではありません。
だから私の質問は:
max<a>
マッチングできない理由は?これを扱う規則や基準はありますか?
================================================== ===============
わかりました、次のような C++ 標準 (文書番号 N4659) を見つけました。
[ 注: クラス テンプレートの部分的な特殊化は、プライマリ クラス テンプレートを検索し、そのテンプレートのすべての部分的な特殊化を検討することによって検出されます。using 宣言がクラス テンプレートに名前を付ける場合、using 宣言の後に導入された部分的な特殊化は、プライマリ テンプレートが表示されるため、効果的に表示されます (17.5.5)。— エンドノート]
したがって、通常のテンプレートから特殊化されていない形式の表現を生成できる場合もありますが、ベース/プライマリ テンプレートから特殊化されていない部分的に特殊化されたテンプレートはエラーと見なされると思います。
c++ - T& と T const& に関する半順序のルールを理解する方法
これらの部分的な順序付け規則について混乱しています。ここにいくつかの引用があります: [temp.deduct.partial]/5
部分的な順序付けが行われる前に、部分的な順序付けに使用される型に対して特定の変換が実行されます。
が参照型の場合
P
は、参照される型にP
置き換えられます。が参照型の場合
A
は、参照される型にA
置き換えられます。
と の両方が参照型であった場合
P
(A
上記の型に置き換えられる前)、2 つの型 (存在する場合) のどちらが他方よりも cv 修飾されているかを判断します。それ以外の場合、部分的な順序付けのために、型は同等に cv 修飾されていると見なされます。この判定結果を以下に使用する。
最上位の cv 修飾子をすべて削除します。
P
が cv 修飾された型である場合、 の cv 修飾P
されていないバージョンに置き換えられP
ます。
A
が cv 修飾された型である場合、 の cv 修飾A
されていないバージョンに置き換えられA
ます。
まず、 と の両方void show(T&)
が左辺値void show(T const&)
を渡すことで呼び出される可能性があるint
ため、半順序規則を使用して、どちらの関数がより一致するかを判断する必要があります。次に、上記の引用に従って、いくつかの変換を行います。ステップ1:
ステップ2:
#5 => #6
、#6 => #5
、演繹は両方向で成功します。次に、次のルールが機能します: [temp.deduct.partial]/9
特定の型について、演繹が両方向で成功し (つまり、上記の変換後に型が同一である)、両方が参照型
P
でA
あった場合 (上記の型に置き換えられる前):
引数テンプレートの型が左辺値参照で、パラメーター テンプレートの型がそうでない場合、パラメーターの型は少なくとも引数の型と同じくらい特殊化されているとは見なされません。
それ以外の場合、引数テンプレートの型がパラメーター テンプレートの型よりも cv 修飾されている場合 (上記のように)、パラメーターの型は少なくとも引数の型と同じくらい特殊化されているとは見なされません。
その#4
ため、より専門的#3
です。指定された値に対してa
、#2
関数を呼び出す必要がありますが、実際には#1
関数が呼び出されます。なんで?私の理解に何か問題がありますか?