Вопреки своим ожидания, вижу на консоли следующие строки:
TestClass()
<< 100
<< 200
~TestClass()
В моем представлении все должно отработать так:
1) return создает локальный экземпляр внутри TestFunc()
2) Далее он делает копию экземпляра, которая уже попадает в область видимости main()
3) Для локального объекта при выходе из TestFunc() вызывается деструктор ~TestFunc()
4) Для созданной копии срабатывает оператор <<
Те сначала должен отработать деструктор, и только потом <<. На консоли ожидал увидеть следующее:
Этот код я компилировал еще в MSVC 2003. А там вроде NRVO даже близко не пахнет. Так что теоритически все должно отработать так как я описал в первом посте. Вопрос по-прежнему остается открытым.
Здравствуйте, Init64, Вы писали:
I>Этот код я компилировал еще в MSVC 2003. А там вроде NRVO даже близко не пахнет. Так что теоритически все должно отработать так как я описал в первом посте. Вопрос по-прежнему остается открытым.
Если я все правильно понимаю, то я сам виноват в том, что Вы запутались
Здравствуйте, srggal, Вы писали:
S>Здравствуйте, Init64, Вы писали:
I>>Этот код я компилировал еще в MSVC 2003. А там вроде NRVO даже близко не пахнет. Так что теоритически все должно отработать так как я описал в первом посте. Вопрос по-прежнему остается открытым.
S>Если я все правильно понимаю, то я сам виноват в том, что Вы запутались
S>
S>>Попробуйте скомпилировать вариант с NRVO, в 2003 — он не должен Вас удивить.
Имелось в виду, что при таком варианте
TestClass TestFunc()
{
TestClass a; // Named RVOreturn a;
}
Вывод будет соответсвовать вашим ожиданиям, поскольку в данном сварианте речь идет об NTVO, который 2003 не поддерживает.
I>Все хорошо, но в 2003 нет ни слова про NRVO
Я же Вам написал, что я Вас запутал, Ваш случай — это RVO, и его 2003'я поддерживает ( хотя на M$ не могу найти соответсвкюшую ссылку )