Это гарантированное поведение. Фактическое выполнение развернуто следующим образом:
0: enter block (scope)
1: Foo::Foo()
2. evaluation of bar(); as expression in return statement
3. save result of the expression as value returned from function
4. finalize return statement to leave function to its caller (request exit from current scope)
5: exit block (scope) with call to Foo::~Foo()
Вот некоторые ссылки из стандарта:
- Что гарантирует выполнение программы, обычно
1,9 Выполнение программы
10 Экземпляр каждого объекта с автоматической продолжительностью хранения (3.7.2)
связано с каждой записью в его
блок.
-
foo
имеет длительность автоматического хранения и:
3.7.2 Срок хранения в автоматическом режиме
1 Локальные объекты явно объявлены auto или register или не объявлены явно
статические или внешние имеют автоматическую продолжительность хранения. Хранение для
эти объекты сохраняются до выхода из блока, в котором они созданы.
- Каков фактический эффект от оператора возврата
6.6.3 Оператор возврата
2 (...) значение выражения возвращается вызывающей функции
и
6.6 Операторы перехода (возврат относится к операторам перехода)
2 При выходе из области (хотя и выполненной) деструкторы (12.4) вызываются для всех
построенные объекты с автоматическим сроком хранения (3.7.2)
6.7 Заявление о декларации
2 Переменные с автоматической продолжительностью хранения, объявленные в блоке:
уничтожен на выходе из блока
и
12.4 Деструкторы
10 Деструкторы вызываются неявно (1) для построенного
объект со статической продолжительностью хранения
(3.7.1) при завершении программы
(3.6.3), (2) для построенного объекта
с автоматической продолжительностью хранения
(3.7.2) когда блок, в котором
объект создан, выходы (6.7)
Нелегко понять отдельные детали формы идеи, разбросанные по всему стандарту C ++. Надеемся, что краткий обзор поможет вам сделать такой анализ самостоятельно.