1

在这样的代码中

#include <iostream>
#include <memory>

struct A {
    int i;

    A() {
        std::cout << "A()" << std::endl;
    }

    ~A() {
        std::cout << "~A()" << std::endl;
    }
};

void f(const A& a) {
    std::cout << "f(A)" << std::endl;
}

std::unique_ptr<A> make_a() {
    return std::make_unique<A>();
}

int main() {
    f(*make_a());
}

是否保证A只有在执行后才会删除对象f()

4

5 回答 5

6

是的,它保证临时将在完整表达式之后被销毁,其中包括函数的调用f()

作为评估完整表达式的最后一步,所有临时对象都被销毁,该完整表达式(在词法上)包含创建它们的点,如果创建了多个临时对象,它们将按照与创建顺序相反的顺序被销毁。即使评估以抛出异常结束也是如此。

于 2019-09-23T11:28:46.683 回答
4

对,那是正确的。C++ 标准明确规定,作为函数参数传递的所有匿名临时对象在函数调用中都存在。

于 2019-09-23T11:28:30.617 回答
4

评估完整表达式后,将删除对象f(*make_a());

于 2019-09-23T11:28:39.430 回答
4

一旦它们所涉及的完整表达式结束,临时对象就会被破坏。

在您的情况下,完整的表达式f(*make_a()),这意味着一旦调用f完成(在函数f返回之后),对象将被破坏。

于 2019-09-23T11:28:53.643 回答
4

是否保证只有在执行 f() 之后才会删除 A 对象?

C++ 标准保证所有临时对象都存在,直到完整表达式的评估结束(以分号结尾的那个;)。有关完整详细信息,请参阅Lifetime :

作为评估完整表达式的最后一步,所有临时对象都被销毁,该完整表达式(在词法上)包含创建它们的点,如果创建了多个临时对象,它们将按照与创建顺序相反的顺序被销毁。即使评估以抛出异常结束也是如此。

于 2019-09-23T11:29:01.813 回答