【问题标题】:Is there some way to guarantee relative order of destructors?有没有办法保证析构函数的相对顺序?
【发布时间】:2020-05-09 05:14:05
【问题描述】:

如果我有类似的东西:

auto foo=Foo(Bar())

在 Foo 的构造函数对 Bar 进行 const 引用的地方,有没有办法确保 Bar 的析构函数不会在 foo 范围末尾的 foo 上的析构函数之前被调用,这样对 Bar 的引用仍然有效即使在 foo 的析构函数中?

【问题讨论】:

  • 如果想让Barfoo之后被销毁,则需要使其作用域大于foo的作用域。你可以做const auto bar = Bar(); auto foo = Foo(bar);
  • 是否有理由将其标记为 c++17 而不仅仅是 c++?

标签: c++ c++17 destructor


【解决方案1】:

保证了析构函数的相对顺序。

auto foo=Foo(Bar());

由于Bar() 是一个临时的,所以它保证在表达式的末尾被破坏:也就是分号。绝对保证Barfoo 之前被销毁。

没有办法延长这个临时的生命周期,你必须复制它(可能通过移动它)。或者:

{
   Bar b;
   auto foo=Foo(b);
}

由于单个作用域中的对象以与它们构造相反的顺序被销毁,因此由于它们在同一作用域中,b 将在foo 被销毁后被销毁。

【讨论】:

  • >没有办法延长这个临时文件的生命周期,你必须复制它。在这种情况下,移动而不是复制可能更好。
  • @Stu 从技术上讲,移动构造函数是复制对象当前状态的一种方法,但我已经澄清了这句话。
猜你喜欢
  • 1970-01-01
  • 2014-01-18
  • 2021-06-23
  • 1970-01-01
  • 2019-06-15
  • 2011-03-24
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多