2015-12-31 7 views
8

Stavo guardando un codice che ho scritto per un progetto scolastico, che a un esame più attento mi sembrava strano. Ho avuto una classe simile a quello qui sotto:Spingere indietro la stringa sul vettore di oggetti

class Foo { 
public: 
    Foo(std::string s) : _s(s) {} 
private: 
    std::string _s; 
}; 

int main() { 
    std::string str = "Hiyo"; 

    std::vector<Foo> f; 
    f.push_back(str); // Compiles. Weird to me though. 
    f.push_back(Foo(str)); // Predictably, this compiles as well. 

    return 0; 
} 

Perché è la prima chiamata a push_back una dichiarazione valida, anche se non è un strFoo?

risposta

16

Classe Foo ha un ctor non esplicita prendendo un argomento di tipo std::string (cioè Converting constructor), il che significa che potrebbe essere implicitamente colato da un std::string.

f.push_back(str);  // implicit casting from std::string to Foo 
f.push_back(Foo(str)); // explicit casting from std::string to Foo 

Nota se si effettua il explicit ctor, il casting implicita sarà vietato.

class Foo { 
public: 
    explicit Foo(std::string s) : _s(s) {} 
// ~~~~~~~~ 
private: 
    std::string _s; 
}; 

e poi

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

Questa dovrebbe essere la risposta accettata in quanto parla di 'esplicito' – CinCout

7

Il primo pushback inizializzerà automaticamente un oggetto dato un oggetto string; attraverso la tua lista di inizializzatori.

(Si aspetta un oggetto Foo, ottiene una stringa: un oggetto può essere inizializzato con una stringa singola? Sì, il suo elenco di inizializzazione ha un singolo elemento e l'oggetto è inizializzato da quell'elemento).

Per maggiori dettagli, si veda ad es .:

+2

La lista di inizializzazione non dovrebbe essere significativo. Compilerà comunque senza di esso. – ChrisD

+1

Cosa succede se 'Foo (std :: string s)' è 'esplicito'? – CinCout

2

Penso che nel primo push back è automaticamente inizializza Foo(str) Così la sua basicaly tha stesso!

Problemi correlati