2011-05-11 8 views
7

Me preguntaba si el siguiente es un comportamiento indefinido¿Es este comportamiento indefinido const_cast?

// Case 1: 
int *p = 0; 
int const *q = *const_cast<int const* const*>(&p); 

// Case 2: (I think this is the same) 
int *p = 0; 
int const *const *pp = &p; 
int const *q = *pp; 

¿Se trata de un comportamiento indefinido mediante la lectura de un int* como si se tratara de un int const*? Creo que es un comportamiento indefinido, pero previamente pensé que solo agregar const en general es seguro, entonces no estoy seguro.

+0

¡Nos lo está pidiendo! :-) Como cuestión de interés, ¿tiene un caso de uso del mundo real para esto? Y como tú, siempre he supuesto que agregar constness no puede romper nada. –

+0

@unapersson ah ¡Acabo de leer la última especificación de C++ 0x y resulta que tiene la respuesta! Estaba discutiendo este problema con mi colega hoy, quien agregó "const" a una "T" para "T *" como un adaptador interator y se encontró con un problema que suplicaba por esta conversión implícita. –

+0

Creo que esto está totalmente bien y no veo nada peligroso aquí. –

Respuesta

5

En cuanto a la calificación, está bien. Con cada expresión dividido en una declaración:

int *p = 0; // ok 
int **addrp = &p; // ok 
int const *const *caddrq = addrp; // ok, qualification conv. according to §4.4/4 
int const *q = *caddrq; // ok 

Nota que las reglas de const_cast (§5.2.11/3) son idénticos a los de la conversión de calificación, pero sin el requisito de ser monótona creciente en la calificación. En su caso, dado que solo está agregando calificaciones, el const_cast es innecesario.


aliasing Con respecto, no creo que es un problema, aquí, o al menos no se pretende que sea.

Al igual que usted ha mencionado, hay una nueva bala en la lista C++ 0x de métodos de acceso permitidos (§3.10) que permite tipos similares (que son tipos "similares" que surgen de las conversiones de calificación). En C++ 03 esa bala falta, pero sospecho que la bala sobre permitir más acceso cv calificado tenía la intención de cubrir eso, pero técnicamente no es así (es decir, el comité pasó por alto esto).

+0

(Por supuesto, ya que estás preguntando, probablemente estoy equivocado.) – GManNickG

+0

@GMan quiero decir, si leo el "int *" por un lvalue de tipo "int const *" ¿no es esto una violación de aliasing? ¡Cuando miré en la especificación hoy, parece haber perdido que agregaron una nueva viñeta para C++ 0x a la lista de reglas de aliasing! –

+0

@GMan "int const *" no es una versión más calificada para cv de "int *". "int * const" sería. –

Cuestiones relacionadas