class TestClass
{
public:
TestClass() { std::cout << "TestClass()" << std::endl; }
~TestClass() { std::cout << "~TestClass()" << std::endl; }
TestClass& operator << (int i) { std::cout << "<< " << i << std::endl; return *this; }
};
TestClass TestFunc()
{
return TestClass();
}
int main()
{
TestFunc() << 100 << 200;
}
Вопреки своим ожидания, вижу на консоли следующие строки:
TestClass()
<< 100
<< 200
~TestClass()
В моем представлении все должно отработать так:
1) return создает локальный экземпляр внутри TestFunc()
2) Далее он делает копию экземпляра, которая уже попадает в область видимости main()
3) Для локального объекта при выходе из TestFunc() вызывается деструктор ~TestFunc()
4) Для созданной копии срабатывает оператор <<
Те сначала должен отработать деструктор, и только потом <<. На консоли ожидал увидеть следующее:
TestClass()
~TestClass()
<< 100
<< 200
Как это работает на самом деле?