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

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

DDD
DDDオリジナル
2024-11-28 15:58:10716ブラウズ

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

値、右辺値参照、および Const 左辺値参照のオーバーロードが存在する場合のオーバーロード解決の曖昧さ

C では、関数呼び出しに複数の実行可能な関数が含まれる場合オーバーロードの場合、オーバーロード解決は厳密な部分順序に基づいて最適な一致を決定します。ただし、次のコードに示すように、特定のシナリオではあいまいさが生じます。

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

int q = f( 3 );

この呼び出しは曖昧ですが、 f( int ) を削除すると、Clang と GCC の両方が右辺値参照オーバーロード f( int && ) を優先します。左辺値参照 f( int const & ) に対して。ただし、いずれかの参照オーバーロードを削除すると、 f( int ) のあいまいさが生じます。

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

オーバーロード解決では、関数呼び出し内のパラメーターの初期化は次のように行う必要があります。他の両方の初期化よりもよく一致します。 2 つの初期化を比較すると、どちらかが優れている場合もあれば、区別がつかない場合もあれば、劣る場合もあります。特定のシナリオでは、直接参照バインディングの特別なルールにより、 int && は const int & よりも優れていますが、どちらも int より優れているわけでも劣っているわけでもありません。したがって、最適な一致は存在しません。

右辺値参照の特別なルール

興味深いことに、左辺値参照よりも右辺値参照を優先するルールは、両方の初期化に参照バインディングが含まれる場合にのみ適用されます。ただし、int の場合のように、1 つの初期化が非参照バインディングである場合、このルールは適用されません。

将来の拡張の可能性

優先する提案オーバーロード解決における int && over int は、所有権を処理するためのより効率的なメカニズムを提供することを目的としています。このアプローチでは、参照をイニシャライザにバインドすることで、オブジェクトが確実に所有され、直接操作できるようになり、コピーのオーバーヘッドが排除される可能性があります。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。