2010-08-09 4 views
5

Il modificatore const in C++ prima di stella indica che utilizzando questo puntatore il valore puntato non può essere modificato, mentre il puntatore stesso può essere fatto puntare qualcos'altro. Nel seguitoargomento puntatore non-const a un parametro const puntatore doppio

void justloadme(const int **ptr) 
{ 
    *ptr = new int[5]; 
} 

int main() 
{ 
    int *ptr = NULL; 
    justloadme(&ptr); 
} 

justloadme funzione non dovrebbe essere consentito di modificare i valori interi (eventuale) puntato dal param passata, mentre può modificare il valore int * (poiché il const non è dopo la prima stella) , ma ancora perché ottengo un errore del compilatore sia in GCC che in VC++?

GCC: errore: la conversione non valida int**-const int**

VC++: errore C2664: 'justloadme': non può convertire il parametro 1 da 'int **' a 'const int **'. La conversione perde i qualificatori

Perché si dice che la conversione perde qualificatori? Non sta guadagnando il qualificatore const? Inoltre, non è simile a strlen(const char*) dove passiamo un non-const char*

+4

http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17 – Anycorn

risposta

8

Come la maggior parte delle volte, il compilatore ha ragione e l'intuizione è sbagliata. Il problema è che se quel particolare incarico è stato permesso si potrebbe rompere const correttezza nel programma:

const int constant = 10; 
int *modifier = 0; 
const int ** const_breaker = &modifier; // [*] this is equivalent to your code 

*const_breaker = & constant; // no problem, const_breaker points to 
           // pointer to a constant integer, but... 
           // we are actually doing: modifer = &constant!!! 
*modifier = 5;     // ouch!! we are modifying a constant!!! 

la linea tracciata con [*] è il colpevole per quella violazione, ed è annullato a causa di quel motivo particolare. Il linguaggio permette di aggiungere const all'ultimo livello, ma non la prima:

int * const * correct = &modifier; // ok, this does not break correctness of the code 
+0

anche se è gradevole per impedire questo 'const' di modificare il fiasco, il compilatore lo fa. Ma usare 'int * const * correct' non mi permette nemmeno di fare' * ptr = new int [5]; '. Cosa faccio? – legends2k

+1

Il problema è molto probabilmente in quanto quello che vuoi fare non è quello che stai scrivendo. Che cosa vuoi essere fatto? La firma prende un 'const int **' ma stai passando un 'int **' e lo trattiamo all'interno della funzione come un 'int **' ... vuoi davvero che 'const' nella firma? –

+1

Oh, ora capisco! Quello che sto cercando di fare è concettualmente sbagliato, quindi sì, hai ragione. Grazie! – legends2k