gpt4 book ai didi

c++ - 在 C++ 中调用临时对象的析构函数的顺序是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:33 25 4
gpt4 key购买 nike

考虑以下代码:

#include <iostream>

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

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

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

void operator<<(const B &) {}
};

C f(const A &a = A()) {
return C();
}

int main() {
f(A()) << B();
}

使用 GCC 编译并运行给出以下输出:

~C
~A
~B

是否保证在用其他编译器编译时,A、B、C类型的临时对象的析构函数会按此顺序调用?一般来说,如果有的话,析构函数调用临时对象的顺序是什么?

最佳答案

让我们谈谈子表达式及其顺序。如果E1 排序在 E2之前, 这意味着 E1必须在 E2 之前进行全面评估是。如果E1 未排序 E2 , 这意味着 E1E2可以按任何顺序进行评估。

对于 f(A()) << B() ,在您的情况下与 f(A()).operator<<(B()) 相同,我们知道:

  • A()f(...) 之前排序,
  • f(...)operator<< 之前排序和
  • B()operator<< 之前排序

这也告诉我们:

  • A()operator<< 之前排序
  • A()B() 无序
  • f(...)B() 无序

如果我们假设 RVO,为了不使事情复杂化,编译器评估子表达式的可能顺序是:

  • A() -> f(...) -> B() , 产生 ~B() -> ~C() -> ~A()
  • A() -> B() -> f(...) , 产生 ~C() -> ~B() -> ~A()
  • B() -> A() -> f(...) , 产生 ~C() -> ~A() -> ~B()

后者是在 OP 中观察到的顺序。请注意,破坏的顺序始终是构造的相反顺序。

关于c++ - 在 C++ 中调用临时对象的析构函数的顺序是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13823520/

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