Копировать недоразумение 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
}
}
- Возвращаемое значение
func1
копируется из выраженияA{}
, - Значение выражения вызова функции
func1()
копируется в параметр функцииfunc2
,