オブジェクト指向プログラミングでは、変換コンストラクターと演算子は、ある型から別の型へのオブジェクトの変換を容易にします。ただし、実行可能な変換パスが複数存在し、どれが優先されるかという問題が生じるシナリオが発生する可能性があります。
指定されたコード スニペットでは、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 のどちらがより多くの知識を持っているかという選択には議論の余地があります。
一方面,人们可能会认为 B(目标类型)是知识渊博的一方,因为它负责定义如何从 A 对象构造自身。 B 中的转换构造函数可以封装特定的转换规则或验证。
另一方面,人们可以主张 A(源类型)对其自身的表示以及如何将其解释为 B 拥有更深入的了解目的。 A 中的转换运算符允许对象控制如何将其转换为 B。
最终,C 标准选择了转换运算符优先的方法,优先考虑源对象的表示。这种选择符合这样的观念:对象本身最了解其自身的内部状态以及如何将其转换为其他类型。但是,必须注意的是,此优先级规则受重载解析规则的约束,因此最终决定可能会受到 const 限定等其他因素的影响,如我们的示例代码所示。
以上是将对象从一种类型转换为另一种类型时,为什么转换运算符优先于转换构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!