【问题标题】:Dereference operator on temporary object临时对象的取消引用运算符
【发布时间】:2020-01-23 11:09:07
【问题描述】:

在这样的代码中

#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()被执行后才会被删除?

【问题讨论】:

  • 在 30 秒内获得 5 个答案
  • @Amadeus:我们今天着火了。我的是第一个。我对此表示祝贺。
  • @Bathsheba 都是正确的 +1 对所有人:D
  • @Amadeus:今年圣诞节提前!

标签: c++ destructor temporary-objects full-expression


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在对完整表达式f(*make_a());求值后将删除该对象

    【讨论】:

      【解决方案3】:

      是的,保证temporary会在完整表达式之后被销毁,其中包括函数f()的调用。

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          C++ 标准保证所有临时对象在 完整表达式(以分号 ; 结尾的那个)的求值结束之前都存在。详情请见Lifetime

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-10-16
            • 1970-01-01
            • 2019-09-22
            • 1970-01-01
            相关资源
            最近更新 更多