2012-01-25 18 views
5

Ho appena scritto una funzione:in che modo std :: string gestisce questo trucco?

void doSomeStuffWithTheString(const std::string& value) { 
... 
std::string v = value; 
std::cout << value.c_str(); 
... 
} 

ma poi io chiamo questo con

doSomeStuffWithTheString("foo"); 

e funziona. Quindi avrei pensato che funzionasse (un const char * per inizializzare un'istanza implicita di std :: string) il valore avrebbe dovuto essere passato per valore, ma in questo caso è passato per riferimento (const).

È per caso una stringa temporanea implicita std :: string creata da const char * quando il riferimento è const? se no, allora come potrebbe funzionare?

EDIT

cosa succede se la funzione è sovraccarica di

void doSomeStuffWithTheString(const char* value); 

quale sceglierà il compilatore?

+0

Hai praticamente risposto alla tua domanda :) – pezcode

+0

interessante, non lo sapevo. Che cosa deve avere un oggetto cosicché i costruttori impliciti avvengano su chiamate const-by-ref (e su come evitarlo?) – lurscher

+1

Il programma è mal formato: 'std :: stringa = valore;' non è valido e dovrebbe essere rifiutato dal compilatore. –

risposta

7

Il tipo std::string ha una conversione implicita (tramite costruttore) da const char*. Questo è ciò che consente alla stringa letterale "foo" di convertirsi in std::string. Ciò si traduce in un valore temporaneo. In C++ è legale avere un valore const & su un valore temporaneo e quindi tutto ciò tiene insieme.

È possibile replicare questo trucco utilizzando i propri tipi personalizzati in C++.

class Example { 
public: 
    Example(const char* pValue) {} 
}; 

void Method(const Example& e) { 
    ... 
} 

Method("foo"); 
0

Sì, uno std::string temporaneo è costruito dalla stringa letterale.

0

Esattamente, utilizzando std::string costruttore di default

0

"il valore dovrebbe essere passati per valore, ma in questo caso è passato da (const) di riferimento."

C'è una funzione C++ dove è possibile passare un valore temporaneo (in questo caso, un temporaneo std::string implicitamente convertito dalla const char *) ad un argomento di const riferimento (in questo caso, const std::string &) TYPE.

Problemi correlati