2013-08-23 10 views
5

Da quando ho dubbi su questo problema (per C++ 03) Vi metto lo here.I appena letto su costruttori di conversione e si afferma checonfuso tra un costruttore di copia e un costruttore di conversione

"Per essere un costruttore di conversioni, il costruttore deve avere un singolo argomento ed essere dichiarato senza parole chiave esplicite. "

Ora la mia domanda è se il costruttore di copie può essere chiamato costruttore di conversioni a condizione che non sia dichiarato esplicitamente? Si qualifica per essere uno? Credo che non possa essere chiamato costruttore di conversioni perché accetta solo lo stesso parametro di tipo che non ha prodotto alcuna conversione. Per istanza

foo a; 
foo b; 
a = 100; //a Conversion constructor would be called (i.e) foo(int a){...} 
a = b ; //Since both objects are same type and have been initialized the assignment operator will be called (if there is an overloaded version otherwise the default will be called) 

La mia comprensione è corretta?

+0

'operator =()' sarà preferibile se possibile, ma la vera domanda è "cosa succede quando non è possibile trovare un'implementazione idonea 'operator =()'? " – cdhowie

+0

pippo a = 100; // è la costruzione della conversione foo b = a; // is copy construction –

+0

[class.conv.ctor]/3 "Un costruttore di copia non esplicito (12.8) è un costruttore di conversione.Un costruttore di copie implicitamente dichiarato non è un costruttore esplicito, ma può essere chiamato per implicito digita le conversioni. " – dyp

risposta

0

Sì, un costruttore di copie è quello che è: un costruttore di copie. Quale non è un costruttore di conversione che converte da un tipo a un tipo diverso.

+0

Questo dovrebbe essere un commento? E puoi aggiustare la grammatica? –

+0

Tranne che ciò che è * è * un costruttore di conversioni. La conversione allo stesso tipo può essere banale, ma è pur sempre tecnicamente una conversione. –

+0

La grammatica corretta è più chiara? –

10

Citando lo standard:

[class.conv.ctor]/3

Un non-esplicito costruttore di copia (12.8) è un costruttore di conversione. Un costruttore di copie implicitamente dichiarato non è un costruttore esplicito; può essere chiamato per conversioni di tipo implicito.

Quindi sì, un copy-ctor è un censore di conversione.

noti inoltre [conv]/1 che specifica e rileva in un'osservazione:

Nota: una sequenza di conversione standard può essere vuoto, cioè, può consistere di conversioni.

e/3:

Un'espressione e può essere convertito in modo implicito un tipo T se e solo se la dichiarazione T t=e; è ben formato

Quindi l'insieme di implicita le conversioni contengono le conversioni vuote.

+0

+1 per una citazione di riferimento eccellente – sehe

Problemi correlati