2010-01-31 14 views
22

Perché il C++ richiede che l'operatore di conversione definito dall'utente possa essere membro non statico? Perché non è consentito l'uso di funzioni standalone come per gli altri operatori unari? Qualcosa di simile a questo:Operatore di conversione come funzione indipendente

operator bool (const std::string& s) { return !s.empty(); } 

risposta

6

l'unica ragione che posso pensare è quello di evitare conversioni implicite applicati alla cosa che viene colato. Nel tuo esempio, se lei ha detto:

bool("foo"); 

poi "pippo" sarebbe implicitamente convertito in una stringa, che sarebbe poi avere la conversione bool esplicita che hai fornito applicato ad esso.

Questo non è possibile se l'operatore bool è una funzione membro, poiché le conversioni implicite non vengono applicate a *this. Ciò riduce notevolmente le possibilità di ambiguità - le ambiguità vengono normalmente viste come una "cosa negativa".

+0

Non capisco il tuo argomento. L'esempio che hai fornito non è una conversione implicita. D'altra parte il motivo principale per la definizione di un operatore di conversione è l'uso della conversione implicita. – shura

+0

@shura Sì, lo è. "foo" viene convertito implicitamente in una stringa, che viene quindi convertita esplicitamente in un bool. Ho aggiornato la mia risposta per chiarire questo. –

+0

Neil, ora capisco il tuo punto. – shura

0

Mantenendo l'operatore di conversione all'interno della classe, l'autore del controllo della classe su come può essere convertito (impedisce agli utenti di creare conversioni implicite). Come implementatore considererei questo un vantaggio, come implicit conversions does have its issues

C'è una differenza che è in grado di passare un oggetto come un altro, e averlo per passare attraverso una funzione di conversione. Il primo comunica che l'oggetto è di un determinato tipo, mentre il secondo mostra ai nuovi lettori che esiste una differenza tra i due tipi e che è necessaria una conversione.

+1

Non fornisce alcun controllo aggiuntivo. Posso (e probabilmente dovrei) semplicemente scrivere una funzione ToBool() per fare la conversione. –

+0

Lo fa anche :) La conversione implicita è qualcosa di molto diverso da un ToBool(). Se potessi farei diventare std :: string implicito convertibile in un char *, ma fortunatamente Stroustrup et al. sapeva meglio. – daramarak

-2

Esiste un gruppo di operatori che devono essere sovraccaricati come funzioni membro non statiche: assegnazione, indice, chiamata funzione, accesso membro classe, funzioni di conversione.

Immagino che il comitato dello standard o Stroustrup abbia semplicemente pensato che sarebbe stato troppo confuso se fosse stato permesso iniettare questi comportamenti molto speciali alle lezioni dall'esterno.


Suppongo che il modo migliore per ottenere la risposta potrebbe essere quella di una e-mail dell'autore.

+0

Non è stato deciso molto prima che la commissione per gli standard si sia mai incontrata per la prima volta? – sbi

+0

O forse Stroustrup si sentiva in questo modo. Questa è solo una speculazione. Cosa hanno in comune tutti questi elementi, quindi devono essere tutti membri? Non vedo alcun motivo tecnico, perché dovrebbero (OK, l'incarico avrebbe un problema tecnico, dal momento che altrimenti il ​​compilatore lo sintetizzerebbe). – UncleBens

+0

triste perché convertire "da std :: string" ad altre cose è un desiderio comune –

-3

Le conversioni implicite definite dall'utente sono accigliate in ogni caso. Non li usano Fai finta che non ci siano. Per non parlare dei nuovi modi di introdurli.

In ogni caso, immagino che non ci siano perché, per come sono, possono fare abbastanza cose inaspettate. Includere una nuova intestazione che introduce una tale conversione per una classe definita da qualche altra parte potrebbe portare a errori ancora più confusi.

+1

+1 anche se direi/s/definito dall'utente // '. –

+0

Quindi, quando C++ 0x consente l'uso di 'explicit' con operatori cast, il tuo argomento è ancora valido? Potrei immaginare qualche utilità per gli operatori cast indipendenti che possono essere usati solo con 'static_cast'. – jamesdlin

+0

Non che io sia un grande fan della conversione implicita definita dall'utente. Non vorrei mai convertire implicitamente stringa in bool come nel mio esempio. Ma a volte sono utili. Prendi std :: string (const char *) per esempio. – shura

Problemi correlati