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

函数返回的const引用能否延长形参生存期?临时对象调用是否安全?

临时对象调用返回const引用的函数是否安全?

问题代码

函数定义:

const vector<int>& getVec(const vector<int> &vec)
{
    return vec;
}

调用代码:

int main()
{
   const vector<int> &v = getVec({1,2,3,4,5});
}

标准结论:属于未定义行为

根据C++标准,当临时对象绑定到函数的const引用参数时,这个临时对象的生命周期仅被延长至函数调用结束时。具体逻辑如下:

  1. {1,2,3,4,5}构造的临时vector<int>会绑定到getVec的参数vec;
  2. getVec执行完毕返回后,该临时对象会被立即销毁;
  3. main中的v绑定的是已销毁临时对象的引用,这是悬垂引用,属于未定义行为。

未定义行为意味着标准不约束程序的具体表现,编译器可生成任意结果,因此g++和Visual Studio的差异完全符合标准:

  • g++中临时对象的内存可能未被立刻覆写,所以表面上值还保留;
  • Visual Studio中临时对象销毁后,其内部的size等成员被清空,导致v.size()返回0。

关于const引用返回值的疑问

const引用返回值并非只能指向函数体执行前已存在的值,但必须满足:返回的引用所指向的对象,在函数返回后生命周期仍未结束。
例如:

  • 返回全局对象的引用是安全的;
  • 返回函数参数的引用时,只有当参数指向的是生命周期长于函数调用的对象(比如全局对象、main中定义的局部对象),才是安全的;
  • 如果参数绑定的是临时对象,返回其引用必然导致悬垂,属于错误用法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 21:52:49