Функция get () - это Построение локального (печать Построение!) И возвращение объекта Foo по значению. Возвращаемый объект Foo должен быть создан с помощью конструкции копирования (печать Создайте копию!). Обратите внимание, что это значение объекта, присвоенное const foo & f в main.
До того, как это присвоение произойдет, функция должна вернуться из get (), а локальные переменные (т.е. foo f; в get ()) должны быть уничтожены. (печать 1st Destructing ..) Оттуда программа завершается (то есть возвращается из main), затем объект, возвращенный get () и назначенный на «f», уничтожается. (печать 2-й Уничтожающий ...)
Причина, по которой вы видите разные выходные данные для двух компиляторов, заключается в том, что GCC оптимизирует возвращаемое значение для get () и просто заменяет const foo &f = get()
на const foo &f = foo
;