c – 赋值操作符和存在引用的复制构造函数
我只是使用这个代码来测试引用:
class A { }; class B { public: B(A& a): m_a(a){} A& m_a; }; int main() { A a; B b(a); B b1 = b; } 我期待B b1 = b;产生错误.相反,当我用VS2008编译时,我只是得到一个警告
我明白为什么我得到这个警告.但编译器不应该生成B b1 = b的错误;声明呢?就像它生成的拷贝构造函数一样,但没有生成赋值运算符.这两个不是固有地相互关联吗?当另一个无法生成时,只为其中一个生成默认实现是有意义的? 解决方法warning C4512: 'B' : assignment operator could not be generated 问题1:为什么这个警告? 问题2:但编译器不应该生成B b1 = b的错误;声明呢? 问题3:就像它生成的拷贝构造函数一样,但没有生成赋值运算符.这两个不是固有地相互关联吗? 问题4:当另一个无法生成时,只生成其中一个的默认实现是有意义的吗? 只是重申您的代码示例中正在执行的操作: B(a);调用转换复制构造函数B :: B(A&) 考虑其他情况. 但如果B :: B(A&)被声明为显式,则编译器会标记错误,并且不会通过充当转换函数来进行任何隐式转换. 检查相同的here. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |