2016-11-25 1 views
0
#include <iostream> 

class A { 
public: 
    A() { std::cout << "Constructor" << std::endl; } 
    A(const A& a) { std::cout << "Copy Constructor" << std::endl; } 
    A& operator=(const A& a) { std::cout << "Copy = operator" << std::endl; } 
    A(A&& a) { std::cout << "Move Constructor" << std::endl; } 
    A& operator=(A&& a) { std::cout << "Move = operator" << std::endl; } 
    ~A() { std::cout << "Destructor" << std::endl; } 
}; 

void f(A&& a) { std::cout << "function" << std::endl; } 

int main() { 
    f(A()); 
    return 0; 
} 

La sortie du programme suivant est:élision semble se produire même si la compilation -fno-Elide-constructeurs

Constructor 
function 
Destructor 

Pourquoi le mouvement constructeur pas appelé ici? Il semble que la copie élision se produit même si je compile avec le drapeau -fno-Elide-constructeurs: g++ test.cpp -fno-elide-constructors -std=c++11

+6

Suis-je spectaculaire stupide? Sûrement 'A()' appelle le constructeur par défaut, alors l'anonyme temporaire peut se lier à 'f (A &&)'. Qu'est-ce que je rate? Un constructeur de déplacement ne peut être appelé que lorsque vous avez un objet construit. – Bathsheba

+1

@Bathsheba: Je ne pense pas qu'il vous manque quelque chose. Étant donné 'A foo();', alors 'A a {foo()};' invoquerait le constructeur de déplacement, mais comme il est, il n'y a rien à déplacer. –

+0

@Bathsheba "Qu'est-ce qui me manque?" Je ne sais pas ... Du temps personnel de bonne qualité? Peut-être que certains dorment aussi? (ne me dérange pas, juste faire des clowns, plaisante, pas de méchanceté). –

Répondre

6

Réponse courte: Vous n'êtes pas emménagez construire quoi que ce soit.

Vous créez simplement un objet temporaire A, puis transmettez une référence à celui-ci. Si vous voulez voir la construction du mouvement, vous pouvez, par exemple, changer la signature de f à

void f(A a)