Я был уверен, что деструкторы для параметров функции должны вызываться при выходе из соответствующей функции. Рассмотрим 5.2.2p4 стандарта С++ 11:
[...] Время жизни параметра заканчивается, когда возвращается функция, в которой она определена. [...]
Однако попробуйте этот код:
#include <iostream>
using namespace std;
struct Logger {
Logger(int) { cout << "Construct " << this << '\n'; }
Logger(const Logger&) { cout << "Copy construct " << this << '\n'; }
~Logger() { cout << "Destruct " << this << '\n'; }
};
int f(Logger)
{
cout << "Inside f\n";
return 0;
}
int main()
{
f(f(f(10)));
}
После компиляции с помощью gcc или clang, выход будет выглядеть следующим образом:
Construct 0x7fffa42d97ff
Inside f
Construct 0x7fffa42d97fe
Inside f
Construct 0x7fffa42d97fd
Inside f
Destruct 0x7fffa42d97fd
Destruct 0x7fffa42d97fe
Destruct 0x7fffa42d97ff
Как мы видим, все три параметра были уничтожены только после завершения последнего вызова функции. Это правильное поведение?