ホームページ > バックエンド開発 > C++ > C のオーバーロード解決は値、右辺値参照、および Const 左辺値参照パラメータをどのように処理しますか?

C のオーバーロード解決は値、右辺値参照、および Const 左辺値参照パラメータをどのように処理しますか?

DDD
リリース: 2024-12-01 09:40:12
オリジナル
345 人が閲覧しました

How Does C   Overload Resolution Handle Value, Rvalue Reference, and Const Lvalue Reference Parameters?

オーバーロードの解決: 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート