Почему конструктор копирования вызывается дважды при возврате, но один раз при передаче по значению в функцию
Недавно я запутался в очень простом вопросе, когда я читал о копировании.
Рассмотрим следующий код:
class Test
{
public:
Test()
{
cout<< "default c'tor"<<endl;
}
Test(const& Test)
{
cout<< "copy c'tor"<<endl;
}
};
Test Func(Test ft) // Case-1
{
Test tmp;
return tmp;
}
int main()
{
Test t1;
Test t2 = Func(t1); // Case-2
return 0;
}
Когда разрешение копирования НЕ выполняется компилятором (использовались -fno-elide-constructors), компилятор обычно создает временный объект, когда объект возвращается по значению.
таким образом, для случая 2 конструктор копирования выполняется дважды. Один для темп. объект и прочее для т2. Понятно, но почему временный объект создается в первую очередь? какая теория лежит в основе создания объекта tmp... Буду очень признателен, если кто-то сможет объяснить это с точки зрения распределения памяти. например, как создаются безымянные объекты для обработки возвращаемых значений из любой функции.
Я предполагаю, что поскольку локальный объект в вызываемой функции (Func) недоступен в вызывающей функции (main), компилятор создает tmp. объект, к которому может получить доступ обе функции.
Если это так, то в случае 1 также должен быть создан промежуточный объект, чтобы вызываемая функция (Func) могла получить доступ к переданному значению, но почему оно не создано?
Спасибо