2015-03-06 5 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()); 
} 

po kompilacji zkopiowania wyrzutnia nieporozumień

g ++ Copy.cpp -std = C++ 11 -fno-Elide-konstruktory

wyjścia:

Def Constr

Kopiuj Constr

Kopiowanie Constr

I moje pytanie brzmi: Dlaczego 2 Kopiowanie Constr? Myślałem, że potrzebna jest tylko 1 kopia.

Mogę zgadywać, że func1() rzuca obiekt tymczasowy, a ten obiekt tymczasowy musi zostać skopiowany do innego regionu pamięci, az tego regionu musi zostać utworzona kopia dla parametru func2(), ale jest dla mnie niejasna .

Czy mógłbyś wyjaśnić to szczegółowo?

+0

Zastanawiam się, jak wynik będzie inny, jeśli func2 przyjmuje odwołanie do const. –

Odpowiedz

2

Tak, twoje zrozumienie jest słuszne. Twój wiersz kodu (bez kopiowania) jest podobny do

int main() 
{ 
    { 
    A temp = func1(); // 2nd copy 
    func2(temp); // 3rd copy 
    } 
} 
6
  1. Wartość zwracana func1 jest kopiowana z wyrażenia A{}.
  2. Wartość wyrażenia wywołania funkcji func1() jest kopiowana do parametru funkcji func2.
Powiązane problemy