我们有这样的代码:
Test1 t1;
Test2 t2;
t1 = t2;
我认为有三个(或更多?)的方式如何实现t1 = t2
- 重载的赋值运算符
Test1
- 重载型铸造操作者
Test2
- 创建
Test1(const Test2&)
转换构造
根据我的测试GCC,这是使用何种优先级:
- 赋值运算符
- 转换器构造器和类型转换运算符(含糊)
- 常量转换构造和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;
}