C++ 有没有办法保证析构函数的相对顺序?

C++ 有没有办法保证析构函数的相对顺序?,c++,c++17,destructor,C++,C++17,Destructor,如果我有以下几点: auto foo=Foo(Bar()) 当Foo的构造函数引用Bar时,是否有某种方法可以确保Bar的析构函数不会在Foo作用域末尾的Foo上的析构函数之前被调用,这样即使在Foo的析构函数中,对Bar的引用仍然有效?析构函数的相对顺序得到保证 auto foo=Foo(Bar()); 由于Bar()是临时的,因此它保证在表达式的末尾被销毁:也就是分号。我们绝对保证在foo之前销毁条 无法延长此临时文件的生命周期,您必须复制它(可能通过移动它)。或者: { Bar

如果我有以下几点:

auto foo=Foo(Bar())

当Foo的构造函数引用Bar时,是否有某种方法可以确保Bar的析构函数不会在Foo作用域末尾的Foo上的析构函数之前被调用,这样即使在Foo的析构函数中,对Bar的引用仍然有效?

析构函数的相对顺序得到保证

auto foo=Foo(Bar());
由于
Bar()
是临时的,因此它保证在表达式的末尾被销毁:也就是分号。我们绝对保证在
foo
之前销毁


无法延长此临时文件的生命周期,您必须复制它(可能通过移动它)。或者:

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

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

如果希望
Bar
foo
之后销毁,则需要使其作用域大于
foo
的作用域。您可以执行
const auto bar=bar();自动foo=foo(bar)有没有理由将它标记为C++ 17而不是C++?>没有办法延长这个临时的生存期,你必须复制它。在这种情况下,移动可能比复制更好。@Stu从技术上讲,移动构造函数是复制对象当前状态的一种方法,但我已经澄清了这句话。