首页 > 解决方案 > 临时对象的取消引用运算符

问题描述

在这样的代码中

#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()

标签: c++destructortemporary-objectsfull-expression

解决方案


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

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


推荐阅读