Вот такой простенький пример взят из книги Г.Шилдта "Самоучитель C++"
#include <iostream>
using namespace std;
class samp
{
int i;
public:
samp(int n)
{
i = n;
cout << "Constructor" << endl;
}
~samp()
{
cout << "Destructor" << endl;
}
int get_i() { return i;}
};
int sqr_it(samp ob)
{
return ob.get_i()*ob.get_i();
}
int main()
{
samp a(10);
cout << sqr_it(a) << endl;
return 0;
}
Результат работы согласно книге:
Constructor
100
Destructor
Destructor
Что меня смущает: получается, что main() сначала вывела результат работы функции, а потом только вызвался деструктор объекта, использовавшегося внутри функции. По-моему должно быть наоборот.
У меня на машине так и есть:
Constructor
Destructor
100
Destructor
Может ли этот порядок выполнения зависеть от платформы, от компилятора? Может ли какой-нибудь хитрый компилятор в целях хитрой оптимизации вызывать всё именно в таком порядке, как в книге? Ведь естественный порядок — сначала вызвать деструктор, потом вывести "100".
Или же просто неточность в книге? Я не супер-пупер специалист по C++, чтобы утверждать это наверняка.