constructor called Move constructor called
3 Réponses :
emplace_back
ne le fait pas construire des temporaires, mais vous avez construit un objet temporaire explicitement par test ()
, puis le nouvel élément est ajouté au vecteur
à partir du temporaire par le constructeur de déplacement.
Vous peut juste
vec.emplace_back();
Merci mon pote! ..Je l'ai. Mais si je veux ajouter un objet de test qui a déjà été créé avant emplace_back, alors emplace_back fonctionnera-t-il comme push_back ?? Si oui, quand dois-je utiliser emplace_back ?? seulement quand je connais les arguments du constructeur?
@bajirao Oui et oui. Si vous possédez déjà l'objet, emplace_back
et push_back
fonctionnent de la même manière. Si vous connaissez les arguments acceptés par le constructeur de la classe et que vous ne souhaitez pas construire l'objet temporaire, vous pouvez utiliser emplace_back
, qui construirait l'élément sur place.
Avec emplace_back (test ())
, vous avez déjà créé un objet en dehors de emplace_back
et il a un constructeur de déplacement donc il est construit par déplacement. Vous devriez donc l'appeler sans aucun argument pour ce cas. Ensuite, vous ne verrez aucun appel de constructeur de copie / déplacement.
vec.emplace_back(1, 2); vec.emplace_back("abcd");
Pour mieux comprendre, si votre classe test
a plus de constructeurs, vous pouvez donner emplace_back
avec ces constructeurs. Par exemple,
class test { ... test(int a, int b); test(const char* c); };
Et vous pouvez le faire.
vec.emplace_back(); // Will create a test object with constructor `test()` internally
Cela ne crée pas d'objet redondant, ce qui n'est pas possible avec push_back
.
Merci Hanjoung! ..Je l'ai. Mais si je veux ajouter un objet de test qui a déjà été créé avant emplace_back, alors emplace_back fonctionnera-t-il comme push_back ?? Si oui, quand dois-je utiliser emplace_back ?? seulement quand je connais les arguments du constructeur?
@bajirao Oui. Dans ce cas, les deux fonctionnent de la même manière. Je pense qu'il est toujours bon d'utiliser emplace_back
tant que vous utilisez C ++ 11 ou version ultérieure. Mais encore push_back
est nécessaire pour la compatibilité du code hérité.
IMHO emplace_back
a été introduit à partir de C ++ 11 car il nécessite des modèles variadiques.
Avec emplace_back
, la méthode sait déjà quel type de classe vous ajoutez à votre vecteur (vous le nommez lors de l'initialisation du vecteur), donc les arguments d'entrée pour emplace_back code > est uniquement les arguments pour le constructeur que vous voulez appeler (généralement vous voulez éviter le constructeur de copie, dont l'argument est un objet de la même classe):
struct A
{
A (int a, int b, int c)
{
// do something
}
A (const A & other)
{
//do something else
}
};
std::vector<A> array;
array . emplace_back (1, 2, 3);
// the above finds the constructor with these input arguments
// makes the new object within the vector - no copy
A obj (4, 5, 6);
array . emplace_back ( obj );
// the above looks for the constructor with this object (A)
// it finds a constructor (the copy constructor) and copies
array . emplace_back ( A (1,2,3) );
// the above first processes the inner part: making a new A object
// then searches for a constructor with that argument (an object A)
// in this case that's the copy constructor
Dans votre cas, vous vouliez appeler un constructeur sans arguments. C'est pourquoi vous souhaitez utiliser emplace_back ()
sans argument pour utiliser correctement cette méthode vectorielle.
Vous créez vous-même l'objet avec
test ()
. Supprimez ça.