h copy copy
в основном h2
из этой строки:
HowMany2 h2 = f(h);
Он разрушается при выходе из main
.
h copy
- аргумент f
, он разрушается, когда f
возвращается.Поскольку f
возвращается до main
, h copy
уничтожается до h copy copy
.
Обратите внимание, что RVO (оптимизация возвращаемого значения) была выполнена компилятором.В этом коде нет созданных временных файлов.На самом деле этот код может выводить разные результаты в зависимости от компилятора.Компилятор может делать 1 или 2 вызова конструктора копирования в этом коде.(Возможно, в этом случае также возможен ноль, хотя я не знаю, как это оправдать.)
Редактировать: Ваш код реализован таким компилятором (псевдокод):
void f(HowMany2 *result, HowMany2* xptr) {
HowMany2 x(*xptr); // local copy
x.print("x argument inside f()");
out << "Returning from f()" << endl;
new(result) HowMany2(x); // copy the return value
x.~HowMany(); // destroy local copy
}
int main() {
HowMany2 h("h");
out << "Entering f()" << endl;
HowMany2 h2; // not initialized
f(&h2, &h);
h2.~HowMany2();
}