C++后置++运算符重载问题:X=X++写法无法完成值递增是什么原因
问题原因
你遇到的是C的未定义行为,由表达式x = x++违反序列点(C11后对应sequenced before规则)导致:
- 后置
++的语义是先返回变量的原始值,再对变量本身执行+1操作 - 表达式
x = x++中同时存在两个对x的修改操作:后置++的自增操作、赋值操作将右侧返回的旧值写入x。这两个修改操作的执行顺序没有被C++标准约束,属于未定义行为,不同编译器可能有不同处理 - 你当前使用的编译器的处理逻辑是:先读取x的原始值,执行x的+1操作,再把之前读取的原始值赋值回x,最终覆盖了自增的结果,因此x的值和初始值一致,这也对应了编译器给出的序列点警告。
- 如果单独写
x++;,整个表达式只有一次对x的修改操作,完全符合规则,因此功能正常。
修复方案
- 直接去掉多余的赋值操作,后置++重载函数里只需要写
x++; y++;即可,不需要赋值给自身 - 额外建议:标准的后置++运算符重载应当遵循原生语义,返回自增前的原对象,调整后的完整重载写法如下:
// 后置++重载的标准写法 A operator++(int) { A old_obj = *this; // 保存自增前的对象状态 x++; y++; return old_obj; // 返回旧状态,符合原生后置++「先取值后自增」的使用习惯 }
- 调用后置++时更推荐用符合习惯的写法
ob++;,无需显式调用operator++并传占位参数。
内容的提问来源于stack exchange,提问作者Satyabrata Kar
相关产品推荐
相关产品推荐

