Порядок уничтожения С++, это необязательно?

Я изучаю С++ и читаю следующее:

Когда объект уничтожается, его деструктор сначала выполняет тело деструктора, а затем >вызывает деструкторы всех членов. Деструкторы элементов вызываются в порядке, обратном их созданию.

Но почему это правильно? программист - это тот, кто пишет деструктор, поэтому он может написать его в любом порядке, который он хочет, который, вероятно, может отличаться от того, что упомянуто выше.


person Community    schedule 11.05.2020    source источник
comment
чтобы он мог писать в любом порядке -- Извините, но нет.   -  person PaulMcKenzie    schedule 11.05.2020
comment
Этого требует стандарт C++. Это связано с тем, что объекты, созданные позже, могут ссылаться на объекты, которые уже были созданы, и могут ожидать, что созданные ранее объекты будут существовать до тех пор, пока существуют объекты, созданные позже. Следовательно, порядок разрушения должен быть обратным порядку построения. См. связанный вопрос для получения дополнительной информации.   -  person Sam Varshavchik    schedule 11.05.2020
comment
так я получу ошибку?   -  person    schedule 11.05.2020
comment
@clark_smith1 Вы не можете получить ошибку, поскольку нет возможности контролировать порядок уничтожения. Если ваш код имеет плохие побочные эффекты, возникающие из-за порядка уничтожения, вам следует исправить свой код.   -  person PaulMcKenzie    schedule 11.05.2020
comment
Я немного запутался, скажите, пожалуйста, как правильно: а) я могу написать порядок строк функции уничтожения, но компилятор переставит их так, как считает правильным. б) заказ уникален и я ДОЛЖЕН написать один фиксированный заказ.   -  person    schedule 11.05.2020
comment
программист - это тот, кто пишет деструктор -- не совсем, учитывая ваше замешательство. Программист — это тот, кто пишет тело деструктора. После этого компилятор вызывает деструкторы, как описано в вашей цитате.   -  person JaMiT    schedule 11.05.2020
comment
так что "а" правильно?   -  person    schedule 11.05.2020
comment
@clark_smith1 Нет, компилятор не будет переставлять строки в теле деструктора (так же, как он переставляет строки кода в телах других функций).   -  person JaMiT    schedule 11.05.2020
comment
@clark_smith1 Чтобы быть более точным, ни «а», ни «б» неверны. Цитата ничего не говорит о порядке написания строк программистом.   -  person JaMiT    schedule 12.05.2020