对临时对象的解除引用运算符

tml*_*len 0 c++ destructor temporary-objects full-expression

在这样的代码中

#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());
}
Run Code Online (Sandbox Code Playgroud)

是否可以保证A仅在f()执行对象后删除该对象?

son*_*yao 5

是的,可以保证临时函数在全表达式(包括调用函数)后将被销毁f()

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


Max*_*kin 5

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

C++ 标准保证所有临时对象都存活到完整表达式(以分号结尾的表达式;)求值结束为止。有关完整详细信息,请参阅生命周期

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