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

为何返回函数默认实参的引用合法?为何f()不返回悬垂引用?

问题解答

先看你给出的代码:

#include <iostream>

//class for testing**

class T
{ 
public:
    void print() { std::cout << "hello\n"; }

    ~T() { std::cout << "~T\n";}
};

//function for testing

T& f(T&& obj = T())
{   
    return obj;
}

int main()
{
    f().print(); // outputs first "hello", second "~T"
}

为什么返回默认实参的引用合法且不会产生悬垂引用?

你觉得默认实参是局部变量其实是个误解,这里的默认实参T()是一个临时对象,不是函数f内部的局部变量。

按照C++标准的规定:当临时对象被用作函数的默认实参时,它的生命周期会被延长到包含该函数调用的完整表达式结束时。在你的代码里,f().print()就是一个完整表达式——从调用f()开始,到print()执行完毕,整个表达式才算结束。

再看函数f的参数是T&&(右值引用),它可以合法绑定到临时对象T()上。函数返回的引用就是绑定到这个临时对象的引用,而这个临时对象的生命周期一直持续到print()调用完成之后才会销毁,所以在print()执行的时候,引用指向的对象是有效的,不会出现悬垂引用的问题。

这就是为什么程序会先输出hello(print()的结果),再输出~T(临时对象销毁时的析构函数调用结果)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 06:30:05