Home > Article > Backend Development > Why does the conversion operator take precedence over the conversion constructor when converting an object from one type to another?
オブジェクト指向プログラミングでは、変換コンストラクターと演算子は、ある型から別の型へのオブジェクトの変換を容易にします。ただし、実行可能な変換パスが複数存在し、どれが優先されるかという問題が生じるシナリオが発生する可能性があります。
指定されたコード スニペットでは、A オブジェクトを B 変数 (B) に割り当てるときに、変換演算子が呼び出されます。 b = A();)、変換演算子と変換コンストラクターの両方が存在するにもかかわらず。次のセクションでは、この動作の背後にある理論的根拠とその哲学的意味について詳しく説明します。
C 標準では、セクション 13.3.1.4 であいまいな変換呼び出しを解決するための優先順位を確立しています。 「最適な」ユーザー定義変換を選択するためにオーバーロード解決が使用されると述べています。この場合、候補関数には B の変換コンストラクターと A の変換演算子の両方が含まれます。
ソースと宛先の型が異なるクラス (S と T) の場合、コンパイラーは型 T のオブジェクトを初期化します (コピーの初期化経由)、一連の変換ステップを適用することによって。この標準では、S とその基本クラスの両方の変換関数が考慮されています。追加の cv 修飾子なしで T に一致する型、または T から派生した型を生成する変換関数が候補になります。このステップにより、この場合、演算子 B() と B(const A&) の両方が候補として選択されます。
その後、C 標準はオーバーロード解決を適用して、引数に最も一致するものを決定します。引数リストは、このインスタンスの初期化子式で構成されます。私たちのコードでは、引数は左辺値である A オブジェクトです。
優先順位を決定する重要な要素はセクション 13.3.3.2/3 にカプセル化されています。「2 つの候補関数が両方とも参照バインディングであり、参照バインディングである場合」互換性のある型では、参照の cv 修飾が最も少ないものが優先されます。"
私たちのコードでは、演算子 B() はメンバー関数であるため、型 A の左辺値を受け取りますが、B(const A&) は const 参照を受け取ります。演算子 B() は const 修飾の数が少ないため、コンパイラーによって上位の候補として選択され、変換演算子が呼び出されます。
哲学的解釈より観点からすると、変換がどのように行われるかについて A と B のどちらがより多くの知識を持っているかという選択には議論の余地があります。
On the one hand, one could argue that B (the target type) is the more knowledgeable party because it is responsible for defining how to construct itself from an A object. The conversion constructor in B can encapsulate specific conversion rules or validations.
On the other hand, one could advocate that A (the source type) possesses greater insight into its own representation and how it can be interpreted as a B object. The conversion operator in A allows the object to control how it is transformed into B.
Ultimately, the C standard has opted for the approach where the conversion operator has precedence, giving priority to the source object's representation. This choice aligns with the notion that the object itself has the best understanding of its own internal state and how it can be converted to other types. However, it is essential to note that this precedence rule is subject to the rules of Overload Resolution, whereby the final decision can be influenced by other factors such as const-qualification, as demonstrated in our example code.
The above is the detailed content of Why does the conversion operator take precedence over the conversion constructor when converting an object from one type to another?. For more information, please follow other related articles on the PHP Chinese website!