Почему конструктор копирования вызывается дважды при возврате, но один раз при передаче по значению в функцию

Недавно я запутался в очень простом вопросе, когда я читал о копировании.

Рассмотрим следующий код:

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) могла получить доступ к переданному значению, но почему оно не создано?

Спасибо

0 ответов

Другие вопросы по тегам