6

なぜこれがあいまいなのですか?

template<class T> void g(T)  {}   // 1
template<class T> void g(T&) {}   // 2

int main() {
    int  q;
    g(q);
}

これは部分的な順序付けのコンテキストであることを理解しています。そして、おそらく間違っていると思いますが、#2 の T& を #1 に入れることはできますが、#1 の T を #2 に入れることはできません。したがって、部分的な順序付けが機能するはずです。

4

2 に答える 2

7

わかった。これがあなたが探しているものだと思います。パラメータと引数の型の比較の2回の適用に飛び込むのではなく、標準の次のことが私に飛び出します。

C++11§14.8.2.4p5

半順序が実行される前に、半順序に使用される型に対して特定の変換が実行されます。

  • Pが参照型の場合、Pは参照される型に置き換えられます。
  • Aが参照型の場合、Aは参照される型に置き換えられます。

C ++11§14.8.2.4p6では、両方が参照型である場合に何が起こるかについて説明しますが、ここでは適用できません(興味深い読み物でもあります)。あなたの場合、1つだけなので、削除されます。そこから:

C++11§14.8.2.4p7

トップレベルのcv-qualifiersを削除します。

  • Pがcv修飾タイプの場合、Pはcv非修飾バージョンのPに置き換えられます。
  • Aがcv修飾タイプの場合、Aはcv非修飾バージョンのAに置き換えられます。

これで、両方が完全に等しくなり、あいまいさが生じます。これは、C++11§14.8.2.4p10から固められていると思います。C ++11§14.8.2.4p9のテキストは、両方が参照型であることをカバーしていますが、ここでもそうではありません。

C++11§14.8.2.4p10

考慮される各タイプについて、特定のテンプレートが少なくともすべてのタイプに特化し、一部のタイプのセットにさらに特化し、他のテンプレートが特定のタイプに特化していないか、少なくとも特定のタイプに特化していない場合、テンプレートは、他のテンプレートよりも特殊化されています。それ以外の場合、どちらのテンプレートも他のテンプレートよりも特殊化されていません。

しかし、このセクションの標準を読むことは、私にとってギリシャ語を解読するようなものなので、私はベースから離れているかもしれませ。(ギリシャ人への攻撃はありません= P)。

しかし、それは私に「同じ呼び出し条件が与えられた場合、私が今読んだすべてが書かれたとおりに強制された場合、const T&反対も曖昧になるはずだ」と思わせました。案の定、私はそれを試しましたが、同じあいまいさが報告されました。Tg(q)

于 2013-01-22T08:22:54.783 に答える
4

これら 2 つのタイプがクラス テンプレートの部分的な特殊化の部分的な順序付けで競合している場合、あなたの推論は正しいです。

ただし、参照型が非参照型と比較される場合、一般的な要点は、どちらか一方が優先される場合、呼び出しシナリオではあいまいであるということです。つまり、参照型の参照の種類は、他と比較した場合のオーバーロード解決では問題にならないため、部分順序付けでも考慮されません。

于 2013-01-22T08:26:00.477 に答える