gpt4 book ai didi

函数调用中的 C++ 临时对象生命周期

转载 作者:太空狗 更新时间:2023-10-29 23:48:31 24 4
gpt4 key购买 nike

当我们通过原始指针或引用将由临时智能指针管理的对象传递给函数时,标准是否保证对象的生命周期会延长到函数的生命周期?

#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;
}

我希望一旦从中获得原始指针,由 unique_ptr 管理的 A 的实例就会被销毁,因为它是一个临时的,并且没有绑定(bind)到函数参数。所以输出可能是

~A()
f()

但是 gcc 和 clang 都让它一直运行到函数结束,即输出是

f()
~A()

看来临时智能指针并没有被销毁。

为什么 A 实例(位于堆中)一直存活到函数结束?非常感谢对该标准的一些引用。

最佳答案

临时对象一直存在到创建它们的完整表达式的末尾(有一些生命周期延长异常(exception)),参见 [class.temporary]/4 .

在您的情况下,临时兴趣类型为 std::unique_ptr<A>makeA() 创建this 的子表达式的完整表达式是 f(*makeA()); , 所以临时的生命周期将在那个分号处结束。

unique_ptr 的对象管理也仅在 unique_ptr 时被销毁本身被销毁(这就是智能指针的目的)。

有关该规则的异常(exception)情况,请参阅标准的以下段落。

关于函数调用中的 C++ 临时对象生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57783447/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com