C のオーバーロード解決は `int`、`int&&`、および `const int&` をどのように処理しますか?

Patricia Arquette
リリース: 2024-11-20 19:58:16
オリジナル
257 人が閲覧しました

How Does C   Overload Resolution Handle `int`, `int&&`, and `const int&`?

Value、Rvalue Reference、Const Lvalue Reference の間のオーバーロード解決

次の関数のオーバーロードを考慮します。

int f( int );
int f( int && );
int f( int const & );
ログイン後にコピー

int q = f( 3 ); の呼び出し3 つのオーバーロードはすべて引数に対して実行可能であるため、これは曖昧です。オーバーロード解決のルールでは、他のパラメータの初期化よりも優れたパラメータの初期化が 1 つ存在する必要があると規定されています。

この場合、パラメータの初期化は次のとおりです。

  • int from 3
  • int&& from 3
  • int const& from 3

ただし、これらの初期化はいずれも他の 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 サイトの他の関連記事を参照してください。

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