C++中调用返回临时对象的成员函数后,对象销毁时机咨询
C++临时对象生命周期:调用成员函数后的销毁时机
首先得先指出你代码里的一个关键问题:B b1();这行不是创建B类的对象,而是声明了一个名为b1、返回B类型的函数!这会导致后续return b1;编译失败,因为你试图返回一个函数指针去匹配返回类型B。正确的写法应该是B b1;来实例化一个B对象,我们基于修正后的代码来分析你的问题。
回到你的核心问题:这个场景的行为是C++标准明确规定的,完全不依赖编译器实现。
标准规则说明
根据C++标准,临时对象的生命周期默认会持续到包含它的完整表达式(full-expression)结束时。所谓完整表达式,指的是不被嵌套在其他表达式中的独立表达式,简单来说就是单个语句中从开头到分号的整个逻辑。
结合你的代码分析
修正后的代码片段:
class B { int f2() { return 5; } }; class A { B f1() { B b1; return b1; } }; A var; int p = var.f1().f2();
在int p = var.f1().f2();这个语句中:
var.f1()执行,返回一个临时的B对象;- 这个临时对象被用来调用
f2(),获取返回值5; - 赋值操作完成,把5赋值给p;
- 整个完整表达式执行完毕,临时B对象才会被销毁。
也就是说,临时对象不会在f2()返回后立即销毁,而是存活到整个语句结束(当前作用域的这个语句执行完)。
补充说明:只有当临时对象被绑定到const左值引用或者右值引用时,它的生命周期才会被延长到引用的生命周期结束——但你的代码里没有这种情况,所以遵循默认的完整表达式结束销毁规则。
内容的提问来源于stack exchange,提问作者Zhani Baramidze
相关产品推荐
相关产品推荐

