2010-08-09 19 views
5

El modificador const en C++ antes de la estrella significa que al usar este puntero, el valor apuntado no se puede cambiar, mientras que el puntero puede señalar algo diferente. En el siguienteargumento de puntero no const a un parámetro de puntero doble const

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

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

justloadme función no se debe permitir que editar los valores enteros (si los hay) que apunta el parámetro pasado, mientras que puede editar el valor int * (ya que la const no es después de la primera estrella) , pero ¿por qué obtengo un error de compilación tanto en GCC como en VC++?

GCC: error: conversión no válida int**-const int**

VC++: error C2664: 'justloadme': no ​​se puede convertir parámetro 1 de 'int **' a 'const int **'. La conversión pierde calificadores

¿Por qué dice que la conversión pierde calificadores? ¿No está ganando el calificador const? Además, ¿no es similar a strlen(const char*) donde pasamos un no-const char*

+4

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

Respuesta

8

Como la mayoría de las veces, el compilador es correcto y la intuición incorrecta. El problema es que si se permitió que la asignación particular, se podría romper const-corrección en su programa:

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 línea marcada con [*] es el culpable de que la violación, y no está permitido por esa razón en particular. El lenguaje permite añadir const al último nivel, pero no el primero:

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

Aunque es agradable que para no permitir este fiasco de modificación 'const' el compilador hace esto. Pero usar 'int * const * correct' ni siquiera me permitirá hacer' * ptr = new int [5]; '. ¿Qué debo hacer? – legends2k

+1

Probablemente el problema es que lo que quiere hacer no es lo que está escribiendo. ¿Qué es lo que quieres que se haga? La firma toma 'const int **' pero está pasando un 'int **' y tratándolo dentro de la función como 'int **' ... ¿realmente quiere ese 'const' en la firma? –

+1

¡Oh, ahora lo entiendo! Lo que trato de hacer es conceptualmente incorrecto, entonces sí, tienes razón. ¡Gracias! – legends2k

Cuestiones relacionadas