In C++, il valore letterale 0
ha tipo int. Non puoi cambiare nulla essendo un numero intero, senza aggiungere almeno un punto decimale. (Senza effettiva necessità di scrivere cifre dopo il punto però)
di rispondergli domanda implicita per quanto riguarda il motivo per cui la chiamata era inequivocabile con 123
ma ambiguo con 0
:
durante l'inizializzazione A
, andava bene perché non c'è conversione implicita da un int a un puntatore (char*
, in questo caso).
durante l'inizializzazione C
utilizzando un int la seconda volta, è stato utilizzato 0
, letterale 0
può essere implicitamente convertito in un puntatore (un comportamento legacy, prima di C++ 11 offerto nullptr
letterale).
Quindi, in poche parole:
int * a = 0; // legal;
int * b = 2; // ILLEGAL;
Quando si inizializza C
una conversione è necessario per dare l'argomento qualsiasi due costruttori disponibili (ed entrambe le conversioni hanno la stessa classifica), la chiamata è ambiguo.
Per rendere inequivocabile, è necessario eseguire il cast del letterale int a un numero doppio ((double)0
), utilizzare un valore letterale doppio (0.
) o aggiungere un costruttore che acquisisce un int. Con questa ultima soluzione, il costruttore che prende un int
è una corrispondenza esatta, quindi è meglio che un altro sovraccarico richieda una conversione (motivo per cui sarebbe stato selezionato).
Modifica. Si prega di notare che la risposta TartanLlama dovrebbe essere accettata qui in quanto è una pratica del C++ migliore: il costruttore che prende una stringa in stile C dovrebbe prendere invece un std::string
.Poiché non v'è una conversione implicita da stringa in stile C per std::string
, la chiamata funziona con pochi cambiamenti:
Var B("abc");
Ma si isolerà l'interfaccia classe da puntatori dettagli.
fonte
2015-06-22 14:13:32
Hai provato ad aggiungere un costruttore che accetta un 'int', chiamando il' double'-costruttore? – Caramiriel
In 'C++' il '0' può essere un * intero zero * o un * puntatore nullo *. Il recente standard 'C++ 11' si rivolge a questo introducendo la parola chiave' nullptr' per il * puntatore nullo *. – Galik
@Galik: Sort of. È ancora vero che '0' è ambiguo. –