Копировать недоразумение Elision

#include <iostream>

struct A
{
    A() { std::cout << "Def Constr\n"; }

    A(const A&) { std::cout << "Copy Constr\n"; }
};

A func1() 
{
    return A{};
}

void func2(A a) {}

int main()
{
    func2(func1());
}

После компиляции с

g++ Copy.cpp -std= C++11 -fno-elide-constructors

Выход:

Def Constr

Копировать Constr

Копировать Constr

И мои вопросы: почему 2 Copy Constr? Я думал, что только 1 копия была необходима.

Я могу предположить, что func1() выбрасывает временный объект, и этот временный объект нужно скопировать в другую область памяти, и снова из этой области должна быть сделана копия для параметра func2(), но для меня это расплывчато.

Не могли бы вы объяснить это подробно, пожалуйста?

2 ответа

Решение

Да, ваше понимание верно. Ваша строка кода (без исключения копирования) похожа на

int main()
{
  {
    A temp = func1();  // 2nd copy
    func2(temp);  // 3rd copy
  }
}
  1. Возвращаемое значение func1 копируется из выражения A{},
  2. Значение выражения вызова функции func1() копируется в параметр функции func2,
Другие вопросы по тегам