このコードを作成しましょう:
Test1 t1;
Test2 t2;
t1 = t2;
実装方法は3つ(またはそれ以上?)あると思いますt1 = t2
- 代入演算子をオーバーロードするには
Test1
- 型キャスト演算子をオーバーロードするには
Test2
Test1(const Test2&)
変換コンストラクターを作成するには
私のGCCテストによると、これは使用されるものの優先順位です。
- 演算子の割り当て
- 変換コンストラクターと型キャスト演算子(あいまい)
- const変換コンストラクターとconst型キャスト演算子(あいまい)
この優先順位の理由を理解するのを手伝ってください。
私はこのコードをテストに使用します(試してみるためにいくつかの行のコメントを外してください)
struct Test2;
struct Test1 {
Test1() { }
Test1(const Test2& t) { puts("const constructor wins"); }
// Test1(Test2& t) { puts("constructor wins"); }
// Test1& operator=(Test2& t) { puts("assign wins"); }
};
struct Test2 {
Test2() { }
// operator Test1() const { puts("const cast wins"); return Test1(); }
// operator Test1() { puts("cast wins"); return Test1(); }
};
int main() {
Test1 t1;
Test2 t2;
t1 = t2;
return 0;
}