You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何返回局部变量引用在该运算符重载场景中能正常运行?

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

内容的提问来源于stack exchange,提问作者neondrop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 00:05:00