わかった。これがあなたが探しているものだと思います。パラメータと引数の型の比較の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&
反対も曖昧になるはずだ」と思わせました。案の定、私はそれを試しましたが、同じあいまいさが報告されました。T
g(q)