2015-03-06 4 views
7
#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()); 
} 

После компиляции сКопировать Элизия Непонимание

г ++ Copy.cpp -std = C++ 11 -fno-Elide-конструкторы

выход:

Def Constr

Копирование Constr

Copy Constr

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

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

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

+0

Интересно, как результат будет отличаться, если func2 принимает константу ссылки. –

ответ

2

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^