8
votes

Pousser la corde à vecteur d'objets

Je parcourais du code que j'ai écrit pour un projet d'école, qui à une inspection plus étroite semblait étrange pour moi. J'ai eu une classe similaire à celle ci-dessous: xxx

pourquoi est le premier appel à push_back une instruction valide, même si str est pas un foo ?


0 commentaires

3 Réponses :


7
votes

Le premier retour à l'autre initialisera automatiquement un objet foo donné une chaîne objet ; via votre liste d'initialistes.

(s'attend à un objet FOO , obtient une chaîne: peut être initialisé un objet foo avec une seule chaîne? Oui, sa liste d'initialistes a un seul élément et l'objet est initialisé à partir de cet élément).

Pour plus de détails, voir E.g.:


2 commentaires

La liste d'initialistes ne devrait pas être significative. Va toujours compiler sans elle.


Et si foo (std :: string s) est explicite ?



2
votes

Je pense que dans le premier bouton, il est automatiquement initialise foo (str) Donc, c'est fondamentalement la même chose!


0 commentaires

16
votes

classe foo code> a une CTOR non explicite prenant un argument de type std :: string code> (c.-à-d. convertisseur constructeur ), ce qui signifie qu'il pourrait être implicitement déposé à partir d'un std :: chaîne code>.

f.push_back(str);      // invalid now
f.push_back(Foo(str)); // still valid


1 commentaires

Cela devrait être la réponse acceptée car il parle de explicite