当我们通过原始指针或引用将临时智能指针管理的对象传递给函数时,标准是否保证该对象的生存期将延长到函数的生存期?
#include <iostream>
#include <memory>
struct A {
~A() {
std::cout << "~A()" << std::endl;
}
};
std::unique_ptr<A> makeA() {
return std::make_unique<A>();
}
void f(const A& a) {
std::cout << "f()" << std::endl;
}
int main() {
f(*makeA());
return 0;
}
我希望实例A
管理者unique_ptr
一旦从中获得原始指针,它就会被销毁,因为它是临时的,并且不绑定到函数参数。所以输出可能是
~A()
f()
但是 gcc 和 clang 都让它一直存在直到函数结束,即输出是
f()
~A()
所以看起来临时智能指针并没有被破坏。
为什么A
实例(位于堆中)存活到函数结束吗?高度赞赏对该标准的一些参考。
临时对象一直存在到创建它们的完整表达式结束为止(有一些生命周期延长例外),请参阅[类.临时]/4.
在你的情况下,暂时感兴趣的类型std::unique_ptr<A>
是由创建的makeA()
完整表达式 this is 的子表达式 isf(*makeA());
,因此临时对象的生命周期将以该分号结束。
该对象unique_ptr
仅当unique_ptr
其本身被破坏(这就是智能指针的目的)。
有关该规则的例外情况,请参阅标准的以下段落。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)