次のシナリオを考えてみましょう:
int f( int ); int f( int && ); int f( int const & ); int q = f( 3 );
f(3) の結果の呼び出し曖昧なオーバーロードの解決策です。 f( int ) を削除すると、Clang と GCC は左辺値参照よりも右辺値参照を優先します。ただし、いずれかの参照オーバーロードを削除すると、 f( int ) のあいまいさが生じます。
オーバーロード解決は通常、厳密な部分順序に従います。ただし、この場合、int は互いに等価ではない 2 つの概念と等価であるように見えます。この状況を管理する具体的なルールは次のとおりです。
13.3.3.2 は、直接参照のための特別なルールを提供します。 binding:
S1 と S2 が参照バインディング (8.5.3) であり、どちらも宣言なしで宣言された非静的メンバー関数の暗黙的なオブジェクト パラメーターを参照していない場合ref-qualifier、S1 は右辺値参照を右辺値にバインドし、 S2 が左辺値参照をバインドすると、S1 の方が S2 よりもよく一致します。
このルールは、初期化の 1 つが次の場合には適用されません。参照バインディングではありません。
という考え方参照バインディングを非参照バインディングよりもよく一致させることが提案されています。このトピックに関する議論を開始するには、そのような提案を ISO C 将来提案フォーラムに投稿することをお勧めします。
以上がオーバーロードの解決が `int`、`int&&`、および `const int&` の間で曖昧なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。