オーバーロードの解決: Value、Rvalue Reference、Const Lvalue Reference
オーバーロードの解決では、複数の場合にあいまいな呼び出しが発生することは珍しくありません。実行可能な関数は同じパラメータ型を共有します。特に興味深いケースは、値、右辺値参照、および const 左辺値参照の間でオーバーロードが発生した場合に発生します。
曖昧性と解決
関数が与えられた場合:
int f( int ); int f( int && ); int f( int const & );
呼び出し int q = f( 3 );曖昧になります。 Clang と GCC は、 f( int ) が削除された場合、左辺値参照よりも右辺値参照を優先します。ただし、いずれかの参照オーバーロードを削除すると、 f( int ) のあいまいさが生じます。
オーバーロード解決のルール
オーバーロードの解決は、一意の「より適切な一致」を見つけることに基づいています。パラメータ。特別なルールがなければ、3 つの初期化 (value、rvalue 参照、const lvalue 参照) はすべて区別できません。
ただし、rvalue 参照は rvalue にバインドされ、const lvalue 参照はバインドされないため、 13.3.3.2 の次のルールにより、右辺値参照の方が一致すると考えられます:
S1 binds an rvalue reference to an rvalue and S2 binds an lvalue reference.
このルールは一致しません。 1 つの初期化が参照バインディングではない場合に適用されます。
将来の標準に関する提案
著者は、将来の標準では int && が強制されるため、int よりも優先されるべきであると提案しています。制約のないオブジェクト型とは異なり、イニシャライザへの初期化バインディング。これは、移動のオーバーヘッドを回避しながら、純粋な値渡しの代替として機能する可能性があります。
以上がC のオーバーロード解決は値、右辺値参照、および Const 左辺値参照パラメータをどのように処理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。