Value、Rvalue Reference、Const Lvalue Reference の間のオーバーロード解決
次の関数のオーバーロードを考慮します。
int f( int ); int f( int && ); int f( int const & );
int q = f( 3 ); の呼び出し3 つのオーバーロードはすべて引数に対して実行可能であるため、これは曖昧です。オーバーロード解決のルールでは、他のパラメータの初期化よりも優れたパラメータの初期化が 1 つ存在する必要があると規定されています。
この場合、パラメータの初期化は次のとおりです。
ただし、これらの初期化はいずれも他の 2 つより優れています。したがって、この呼び出しはあいまいです。
f( int ) を削除すると、Clang と GCC は左辺値参照 (int const&) よりも右辺値参照 (int&&) を優先します。これは、右辺値参照は右辺値 3 にバインドできるのに対し、左辺値参照はバインドできないためです。どちらかの参照オーバーロードを削除すると、 f( int ) があいまいになります。
この動作は、 int が int&& と int const& の両方と同等であるという事実によるものです。ただし、int&& と int const& は同等ではありません。これらのどちらかを選択するためのルールは、両方が参照バインディングであり、int&& が右辺値にバインドされ、int const& が左辺値にバインドされる場合、int&& の方が int const& よりも優れているということです。
このルールは、初期化の 1 つが次の場合には適用されません。参照バインディングではありません。したがって、int は int&& と int const& の両方から区別できません。
将来の標準では int&& が int よりも優先される可能性はありません。提案されたルールでは、参照バインディングの方が非参照バインディングよりも一致しやすくなり、オーバーロード解決の既存のルールに反します。
以上がC のオーバーロード解決は `int`、`int&&`、および `const int&` をどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。