我们有这个代码:
Test1 t1; Test2 t2; t1 = t2;
我相信有三种(或更多?)方法如何实现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; }
解决方法
陈述t1 = t2;相当于:
t1.operator=(t2);
现在通常的重载决策规则适用.如果有直接匹配,那就是所选择的.如果不是,则认为隐式转换与(自动生成的,“隐式定义的”)复制赋值运算符一起使用.
有两种可能的隐式用户定义转换.所有用户定义的转换计数相等,如果两者都定义,则重载不明确:
>通过Test1 :: Test1(Test2 const&)转换构造函数将t2转换为Test1.>通过Test2 ::运算符Test1()const cast运算符将t2转换为Test1.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。