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

Après avoir compilé avecCopie Elision Misunderstanding

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

sortie est:

Def Constr

Copier Constr

Copie Constr

Et mes questions est la suivante: Pourquoi 2 Copie Constr? Je pensais qu'une seule copie était nécessaire.

Je devine peut-être que func1() lance un objet temp et cet objet temp doit être copié dans une autre zone de mémoire et à partir de cette région une copie doit être faite pour le paramètre func2() mais c'est vague pour moi .

Pourriez-vous expliquer en détail s'il vous plaît?

+0

Je me demande comment le résultat sera différent si func2 prend la référence const. –

Répondre

2

Oui, votre compréhension est bonne. Votre ligne de code (sans copier) est similaire à

int main() 
{ 
    { 
    A temp = func1(); // 2nd copy 
    func2(temp); // 3rd copy 
    } 
} 
6
  1. La valeur de retour de func1 est copiée à partir de l'expression A{}.
  2. La valeur de l'expression d'appel de fonction func1() est copiée dans le paramètre de fonction func2.