Есть ли способ гарантировать относительный порядок деструкторов? - PullRequest
2 голосов
/ 23 января 2020

если у меня есть что-то вроде:

auto foo=Foo(Bar())

, где конструктор Foo принимает константную ссылку на Bar, есть ли какой-то способ гарантировать, что деструктор Bar не будет вызван перед деструктором на foo в конец области действия foo, так что ссылка на Bar будет действительна даже в деструкторе foo?

1 Ответ

6 голосов
/ 23 января 2020

Относительный порядок деструкторов гарантирован.

auto foo=Foo(Bar());

Поскольку Bar() является временным, то он гарантированно будет уничтожен в конце выражения: aka точка с запятой. Вы абсолютно гарантированы, что Bar будет уничтожено до foo.

. Невозможно продлить срок действия этого временного файла, вам придется сделать его копию (возможно, переместив его). , В качестве альтернативы:

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

Поскольку объекты в одной области видимости уничтожаются в противоположном порядке их построения, то, поскольку они находятся в той же области видимости, b будет уничтожен после уничтожения foo .

...