C++赋值运算符=重载疑问:为何优先返回对象引用而非void实现
赋值运算符重载返回引用的原因
返回void的赋值运算符重载确实能在单步赋值(例如a = b)的场景下正常运行,但返回*this的左值引用是C++的通用约定,核心原因有以下几点:
- 支持链式赋值语法
内置类型的赋值运算符支持链式调用逻辑,比如int a, b, c; a = b = c = 1;,执行顺序是从右到左,每一步赋值的返回值会作为左操作数参与上一层赋值。如果你的operator=返回void,my_string a, b, c; a = b = c;这类代码会直接编译失败,不符合开发者对赋值运算符的通用使用预期。 - 支持依赖赋值结果的表达式
很多场景下会用到赋值表达式的返回值,比如:
如果返回if ((a = b) == target_str) { // 业务逻辑 }void,赋值表达式没有可用的返回值,这类写法完全无法通过编译。 - 符合C++运算符重载的设计规范
C++标准要求用户重载运算符时,要尽可能保持和内置类型的行为一致,避免违背「最小惊讶原则」:其他开发者调用你实现的my_string类时,会默认赋值运算符的行为和std::string、基础类型的赋值逻辑一致,如果返回void会增加使用成本,甚至触发意料之外的编译错误。
额外提示:你当前的两个实现都存在自赋值安全问题,如果出现
a = a的调用,会先执行__cleanup__释放自身的buf内存,后续访问obj.buf就属于访问已释放的野指针,建议在赋值逻辑前加自赋值判断if (this == &obj) return *this;再执行后续的清理、拷贝逻辑。
内容的提问来源于stack exchange,提问作者hacker_panda
相关产品推荐
相关产品推荐

