さまざまなパラメーターの型 (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 つが参照バインディングではない場合には適用されないため、あいまいさが生じます。
著者は、オブジェクト型がそのような制約を受けない一方で、参照は初期化子にバインドする必要があるため、int(value) よりも int&& (右辺値参照) の方が一致すると考えることを提案しています。これにより、初期化子からのバインドを優先する新しいオーバーロード解決ルールが作成される可能性があります。ただし、この提案にはさらなる議論と、isocpp 将来提案プラットフォームを通じた標準化の可能性が必要です。
以上がC のオーバーロード解決のあいまいさが、Value、Rvalue Reference、および Const Lvalue Reference パラメーター間で発生するのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。