ホームページ > バックエンド開発 > C++ > オーバーロードの解決が `int`、`int&&`、および `const int&` の間で曖昧なのはなぜですか?

オーバーロードの解決が `int`、`int&&`、および `const int&` の間で曖昧なのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-29 00:04:15
オリジナル
807 人が閲覧しました

Why is Overload Resolution Ambiguous Between `int`, `int&&`, and `const int&`?

Value、右辺値参照、および Const Lvalue 参照の間のオーバーロード解決

次のシナリオを考えてみましょう:

int f( int );
int f( int && );
int f( int const & );

int q = f( 3 );
ログイン後にコピー

f(3) の結果の呼び出し曖昧なオーバーロードの解決策です。 f( int ) を削除すると、Clang と GCC は左辺値参照よりも右辺値参照を優先します。ただし、いずれかの参照オーバーロードを削除すると、 f( int ) のあいまいさが生じます。

オーバーロード解決ルール

オーバーロード解決は通常、厳密な部分順序に従います。ただし、この場合、int は互いに等価ではない 2 つの概念と等価であるように見えます。この状況を管理する具体的なルールは次のとおりです。

  • 問題のパラメータの少なくとも 1 つのパラメータ初期化は、他の 2 つのパラメータ初期化よりも適切に一致する必要があります。
  • 2 つの初期化を比較する場合、どちらか一方が他方よりも優れているか、どちらも優れていません (区別できません)。
  • 直接参照バインディングに関する特定のルールがなければ、3 つすべてがこのシナリオでの初期化は区別できません。
  • 直接参照バインディング ルールにより、int && は const int & よりもよく一致しますが、どちらも int より良いか悪いというわけではありません。

特殊なケース: C 標準の Reference Binding

13.3.3.2 は、直接参照のための特別なルールを提供します。 binding:

S1S2 が参照バインディング (8.5.3) であり、どちらも宣言なしで宣言された非静的メンバー関数の暗黙的なオブジェクト パラメーターを参照していない場合ref-qualifier、S1 は右辺値参照を右辺値にバインドし、 S2 が左辺値参照をバインドすると、S1 の方が S2 よりもよく一致します。

このルールは、初期化の 1 つが次の場合には適用されません。参照バインディングではありません。

将来の考慮事項

という考え方参照バインディングを非参照バインディングよりもよく一致させることが提案されています。このトピックに関する議論を開始するには、そのような提案を ISO C 将来提案フォーラムに投稿することをお勧めします。

以上がオーバーロードの解決が `int`、`int&&`、および `const int&` の間で曖昧なのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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