Возвращаемое значение имеет временное время жизни.В C ++ это означает полное выражение, создавшее тип, поэтому деструктор MyType не должен вызываться до тех пор, пока не вернется вызов someFunc.
Мне любопытно, что вы перезаписаны / освобожденыКонечно, вызов delete для этого объекта не является нормальным;он живет в стеке, и его удаление, вероятно, приведет к повреждению кучи.Кроме того, перезапись / изменение может также быть плохим.В вашем примере используется константа "C string";во многих компиляторах значения, подобные этому, хранятся в постоянной памяти, поэтому попытка изменить ее позже может привести к сбою / нарушению доступа.(Однако я не уверен, что Visual C ++ выполняет эту оптимизацию).
Существует большая разница между передачей временных константных и изменяемых ссылок.Создание изменяемой ссылки на временное не разрешено стандартным C ++, и большинство компиляторов (включая GCC) отклонят его, хотя по крайней мере некоторые версии Visual C ++ допускают это.
Если вы передаете его сИзменяемая ссылка, которую вы хотите написать:
MyType t = creatorFunc();
someFunc(t);