Considerate:Implicitamente chiamando costruttore di copia
struct Foo
{
Foo(std::string str) {}
};
struct Bar
{
Bar(Foo f) {}
};
int main(int argc, char* argv[])
{
Foo f("test");
Bar b1(f);
Bar b2(std::string("test"));
Bar b3("test");
return 0;
}
Questo non riesce a compilare sulla dichiarazione di b3 ('non in grado di convertire l'argomento 1 da 'const char [5]' a 'Foo''). Il che ha senso, perché non esiste un modo diretto per convertire il const-char in un Foo. Tuttavia, c'è un modo per convertire il const char in una std :: string, e quindi usarlo per costruire un Foo (che è ciò che sta accadendo in b1 e b2), ed è quello che voglio perché rende l'API più carina da usare (non dover istanziare un Foo o uno std :: string esplicitamente ogni volta).
Quindi la mia domanda è: esiste un modo per consentire al compilatore di chiamare implicitamente il costruttore di copie Foo (std :: string)? In altre parole, c'è un modo per fare una dichiarazione come quella di b3, lasciare che sia uguale a b2 e senza dichiarare un costruttore di copia const char * per Foo? (che l'ultima cosa è la via ovvia ma il mio codice reale non è ovviamente così semplice, e preferirei non dover aggiungere costruttori di copia const char * e gestire tutte le altre inizializzazioni nei costruttori correttamente e tenerlo in sincronizzazione con il costruttore std :: string copy).
Una sequenza di conversione implicita può contenere solo una conversione definita dall'utente. Stai chiedendo due ('const char *' a 'std :: string', quindi' std :: string' a 'Foo'). Un modo per andare sarebbe quello di aggiungere un sovraccarico del costruttore 'Foo' prendendo' const char * '. –
Nitpick: nessuno dei costruttori menzionati è un costruttore * copy *, sono solo costruttori. – molbdnilo
Grazie, "sequenza di conversione implicita" è la stringa magica che stavo cercando. In effetti è impossibile fare ciò che volevo, dovrò usare un costruttore extra. – Roel