#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
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
@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. –
@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é). –