为何返回局部变量引用在该运算符重载场景中能正常运行?
问题解答
- 你的理解完全正确:调用
a / b时,确实会创建a的副本作为operator/的lhs参数,函数返回的是这个修改后副本的引用。 - 代码能正常输出纯粹是偶然,本质上这就是C++标准定义的未定义行为:
lhs是operator/的局部对象(传值参数属于函数内的局部变量),函数执行完毕后,这个对象会被销毁,返回的引用就变成了悬空引用。- 你能看到正确结果,只是因为销毁后的内存暂时没被其他数据覆盖,引用指向的内存碰巧还保留着原来的值。但这种情况完全不可靠,更换编译器、调整优化等级、甚至修改无关代码,都可能导致输出乱码、程序崩溃等问题。
- 正确的写法应该返回值而非引用——除法是生成新对象的操作,符合C++的语义:
这样返回的是局部对象的副本(C++11及以后会自动优化为移动构造,效率无损耗),彻底避免未定义行为。Complex operator/(Complex lhs, const Complex& rhs) { return lhs /= rhs; }
内容的提问来源于stack exchange,提问作者neondrop
相关产品推荐
相关产品推荐

