変換シーケンスのあいまいさ: 変換コンストラクターと演算子の優先順位
クラス A のオブジェクトからクラス B のオブジェクトを初期化する場合、あいまいさ変換コンストラクターと変換演算子の両方が定義されている場合に発生する可能性があります。これらの関数間の相互作用によって、どの関数が呼び出されるかが決まります。
優先順位の確立
C 標準 (8.5/14) によると、ユーザー定義の変換シーケンスは次のとおりです。 A から B に変換できるものが列挙され、オーバーロード解決を通じて最適なものが選択されます。変換演算子は、変換コンストラクターが適用できない場合にのみ考慮されます。
パラメーター変換
オーバーロード解決は、変換関数とコンストラクターを呼び出し引数に一致するパラメーターのリストに変換します。 。変換演算子の場合、暗黙的なオブジェクト パラメーターが生成され、演算子の関数パラメーターとソース オブジェクトの間にバインディングが作成されます。
優勝候補
変換演算子 が勝ち になります。この場合、コンストラクター B(const A&) はパラメーターとして const 参照を持ちますが、変換演算子演算子 B() は非 const 参照を持ちます。ソース オブジェクトは右辺値 (一時的) であるため、非 const 参照はそれにバインドできます。
オブジェクト指向の観点
オブジェクト指向の観点から見ると、 B のコンストラクターではなく A の変換演算子がデフォルトで選択されているということは、変換手順を定義する責任がソース クラス (A) にあることを示唆しています。ただし、宛先クラスとしての B がこの変換に対して主な責任を負うべきかどうかについては議論の余地があります。以上が変換シーケンスの曖昧さ: 変換演算子がコンストラクターよりも優先されるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。