C++赋值运算符返回值而非引用时,为何数组元素未按预期被修改?
问题原因解析
核心问题出在你实现的operator=返回值为值类型而非引用,破坏了连续赋值的语义。我们可以拆解(b[1] = b[2]) = b[0]这行代码的执行过程:
- 第一步执行
b[1].operator=(b[2]):
这一步确实会修改b[1]的_var值为b[2]的0。但由于你的operator=返回的是Base值类型,调用结束后会以*this为参数调用拷贝构造函数,生成一个和b[1]完全独立的临时对象。 - 第二步执行
临时对象.operator=(b[0]):
这次赋值操作修改的是临时对象的_var值为10,完全不会作用到数组里的b[1]本身。这行表达式结束后临时对象就会被销毁,所有修改全部无效。
最终b[1]的状态停留在第一步赋值后的0,所以程序输出和你的预期不符。
如果将operator=的返回值改为Base&,第一步调用结束后返回的是b[1]本身的左值引用,第二步赋值就会直接作用到b[1]上,自然就能得到你预期的10的结果。这也是C++中自定义赋值运算符的规范约定,目的是和内置类型的连续赋值行为对齐。
内容的提问来源于stack exchange,提问作者milanHrabos
相关产品推荐
相关产品推荐

