ホームページ > バックエンド開発 > C++ > C のオーバーロード解決のあいまいさが、Value、Rvalue Reference、および Const Lvalue Reference パラメーター間で発生するのはどのような場合ですか?

C のオーバーロード解決のあいまいさが、Value、Rvalue Reference、および Const Lvalue Reference パラメーター間で発生するのはどのような場合ですか?

Linda Hamilton
リリース: 2024-11-28 11:16:13
オリジナル
807 人が閲覧しました

When Do C   Overload Resolution Ambiguities Arise Between Value, Rvalue Reference, and Const Lvalue Reference Parameters?

オーバーロード解決の曖昧さ: 値、右辺値参照、および Const 左辺値参照

さまざまなパラメーターの型 (value、右辺値参照、const 左辺値参照) を持つ 3 つのオーバーロード関数が与えられたとします。 3 つのオーバーロードがすべて実行可能な場合、関数呼び出しがあいまいになる可能性があります。この記事では、このようなシナリオでのオーバーロードの解決を管理するルールについて説明し、 C で観察される微妙な動作について説明します。

ルール

考慮すべきパラメータが 1 つだけの場合、ルールでは 1 つのパラメータの初期化が必要であると規定されています。他の 2 つの 両方よりも よく一致します。 2 つの初期化を比較する場合、どちらかが優れていると見なされるか、どちらも優れているとは見なされません (区別できない)。

直接参照バインディングに関する特別なルールがない場合、3 つの初期化は 3 つの比較すべてで区別できません。ただし、これらの特別なルールは int&& (rvalue 参照) を const int& (lvalue 参照) よりも上位にしますが、どちらも int (value) より良いとも悪いともみなされません。したがって、最適な一致は存在しません。

比較行列

この動作は次の行列に示されています。

S1    S2
int   int&&         indistinguishable
int   const int&    indistinguishable
int&& const int&    S1 better
ログイン後にコピー

この行列は、int&& が const int& よりも優先されることを示しています。 C 規格の 13.3.3.2 項に基づいています。このルールは、ref 修飾子のない非静的メンバー関数の暗黙的なオブジェクト パラメーターを参照しない参照バインディングに適用されます。S1 は右辺値参照を右辺値にバインドし、S2 は左辺値参照をバインドします。

ただし、このルールは、初期化の 1 つが参照バインディングではない場合には適用されないため、あいまいさが生じます。

Future方向

著者は、オブジェクト型がそのような制約を受けない一方で、参照は初期化子にバインドする必要があるため、int(value) よりも int&& (右辺値参照) の方が一致すると考えることを提案しています。これにより、初期化子からのバインドを優先する新しいオーバーロード解決ルールが作成される可能性があります。ただし、この提案にはさらなる議論と、isocpp 将来提案プラットフォームを通じた標準化の可能性が必要です。

以上がC のオーバーロード解決のあいまいさが、Value、Rvalue Reference、および Const Lvalue Reference パラメーター間で発生するのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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