函数返回的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,2,3,4,5}构造的临时vector<int>会绑定到getVec的参数vec;getVec执行完毕返回后,该临时对象会被立即销毁;main中的v绑定的是已销毁临时对象的引用,这是悬垂引用,属于未定义行为。
未定义行为意味着标准不约束程序的具体表现,编译器可生成任意结果,因此g++和Visual Studio的差异完全符合标准:
- g++中临时对象的内存可能未被立刻覆写,所以表面上值还保留;
- Visual Studio中临时对象销毁后,其内部的
size等成员被清空,导致v.size()返回0。
关于const引用返回值的疑问
const引用返回值并非只能指向函数体执行前已存在的值,但必须满足:返回的引用所指向的对象,在函数返回后生命周期仍未结束。
例如:
- 返回全局对象的引用是安全的;
- 返回函数参数的引用时,只有当参数指向的是生命周期长于函数调用的对象(比如全局对象、main中定义的局部对象),才是安全的;
- 如果参数绑定的是临时对象,返回其引用必然导致悬垂,属于错误用法。
内容的提问来源于stack exchange,提问作者Nater
相关产品推荐
相关产品推荐

