2010-09-27 16 views
9

tutto: questo è citato da Effective C++ 3 ° editiionDomanda su const_cast in C++

const_cast è tipicamente utilizzato per gettare via la costanza degli oggetti. È l'unico cast in stile C++ che può farlo.

La mia domanda è possibile const_cast aggiungere constness a un oggetto non const? In realtà ho scritto un piccolo programma cercando di approvare il mio pensiero.

class ConstTest 
{ 
public: 

void test() { 
    printf("calling non-const version test const function \n"); 
} 

void test() const{ 
    printf("calling const version test const function \n"); 

} 

}; 
int main(int argc,char* argv){ 
ConstTest ct; 
const ConstTest cct; 
cct.test(); 
const_cast<const ConstTest&>(ct).test();//it is wrong to write this statement without the '&',why 

} 

Tralasciando l'errore '&' incorre in basso: C2440

errore: 'const_cast': impossibile convertire da 'ConstTest' a 'ConstTest const'

Essa mostra che const_cast può aggiungere la costanza, ma sembra che tu debba lanciare su un riferimento a un oggetto, qual è la magia di questo riferimento?

+0

Perché dovresti usare const_cast per aggiungere const? Assegna l'oggetto non-const a una variabile const e hai finito. Non ho idea del perchè il riferimento const funzioni nel tuo caso però. –

+2

Supponiamo che una funzione membro abbia una sovrascrittura const e non const: come si chiama la sovrascrittura della const su un oggetto non const senza fare una copia?(La risposta è 'static_cast', ma non è immediatamente chiaro al mio perché' const_cast' non dovrebbe funzionare anche per questo) –

+0

@Tyler: si esegue il casting su un riferimento const, ad esempio con 'static_cast'. –

risposta

6

Non è necessario aggiungere const_cast constness:

class C; 
C c; 
C const& const_c = c; 

L'altro modo ha bisogno di circa un const_cast se

const C const_c; 
C& c = const_cast<C&>(const_c); 

ma il comportamento è indefinito se si tenta di utilizzare le operazioni non-const su c.

A proposito, se non si utilizza un riferimento, una copia dell'oggetto deve essere effettuata:

C d = const_c; // Copies const_c 
+0

Tuttavia, aggiungere 'const' _sometimes_ è una cosa utile da fare, perché consente un codice più conciso piuttosto che aggiungere una variabile aggiuntiva (di riferimento). Vedi la metà inferiore di questa pagina: http://books.google.de/books?id=mT7E5gDuW_4C&pg=PA188. Si noti che può, come [sharptooth correttamente annotato] (http://stackoverflow.com/questions/3803521/question-about-const-cast-in-c/3803545#3803545), essere utilizzato solo per il cast di un 'const '_reference_. – sbi

+0

perché il cast della costanza di const_c non è definito? Che cosa succede se è un tipo built-in, cioè. char, int, bool, ecc.? – Tracy

+0

Il comportamento non è indefinito, a meno che non si tenti di utilizzare il riferimento non const per modificare l'oggetto const. –

2

const_cast può essere utilizzato solo per lanciare ai puntatori e riferimenti. Non può essere usato per trasmettere oggetti. Ecco perché: se hai un oggetto const non puoi renderlo non-const e viceversa - è già const, non puoi ridichiarlo. Puoi solo provare ad accedervi tramite un puntatore o un riferimento senza (o con) const.

1

const_cast non può modificare la costanza del valore. Quindi restituisce un riferimento const al valore.

2

const_cast può essere utilizzato anche per aggiungere constness.

$5.2.11/3 - "For two pointer types T1 and T2 where 

T1 is cv1 , 0 pointer to cv1 , 1 pointer to . . . cv1 ,n − 1 pointer to cv1 ,n T 
and 
T2 is cv2 , 0 pointer to cv2 , 1 pointer to . . . cv2 ,n − 1 pointer to cv2 ,n T 

where T is any object type or the void type and where cv1 ,k and cv2 ,k may be different cv-qualifications, an rvalue of type T1 may be explicitly converted to the type T2 using a const_cast. The result of a pointer const_cast refers to the original object. 

considerare:

int *t1 = NULL; // T = int, cv1, 0 = none 
int * const t2 = const_cast<int * const>(t1); // T = int, cv2, 0 = const 

Come per la citazione di cui sopra, quanto sopra è fine e aggiunge constness a t

Ma, come Herb Sutter dice, probabilmente non è necessario in modo esplicito da fare La maggior parte delle volte.

+0

Ho letto un bel po 'di libri, nessuno di loro ha mai menzionato l'uso di const_cast per aggiungere costanza a un oggetto o riferimento a un oggetto? Tuttavia, ciò che ho riscontrato è l'utilizzo di static_cast per ottenere lo stesso risultato introdotto in Effective C++ da Scott Meyers.OOps, impossibile collegarsi al libro di Google – Tracy

+0

@Tracy: http://lookdit.wordpress.com/2010/05/27/ c-common-knowledge-by-stephen-c-dewherst/(Voce di controllo 9) – Chubsdad