2012-09-05 31 views
9

Es este tipo de conversión segura¿Es seguro reinterpretar el vector de punteros al vector de punteros const?

vector<int*> a; 
const vector<const int*>& b = reinterpret_cast<const vector<const int*>&>(a); 

Un molde estático, obviamente, no funciona en este caso porque el argumento de plantilla está cambiando. Pero al hacer esto reinterpretar el elenco, simplemente estoy agregando constness esencialmente del mismo tipo. Entonces, ¿debería ser seguro para todos los propósitos prácticos?

+2

Una forma en que podría salir mal (aunque no lo he confirmado mediante una prueba) es un alias estricto. El optimizador tiene derecho a suponer que 'b' no se refiere a la misma memoria que' a' (porque tiene un tipo que no es compatible para el aliasing). Entonces el optimizador jugará sus trucos, y es posible que encuentre que reordena o elimina cosas que no volvería a ordenar o eludir si 'a' y' b' * se refieren de manera válida a la misma memoria. Entonces, el diseño idéntico es una condición necesaria pero no suficiente para que "funcione". –

+1

Otra forma de verlo es que el resultado de un 'reinterpret_cast' a una referencia o tipo de puntero es * fundamentalmente * inútil y no sirve para nada más que para volver a convertir al tipo original, a menos que (a) el el tipo de destino es legal para aliasing el tipo real del objeto, o (b) usted tiene una garantía particular de su implementación que admite lo específico que está haciendo. Cuando ninguno de los dos aplica, no se refiere a un objeto a través de otro tipo que no sea el suyo. Hacerlo también se llama "tipo-juego de palabras". –

Respuesta

7

Como cualquier uso de reinterpret_cast para convertir una referencia a un tipo no relacionado, da un comportamiento indefinido, por lo que no es seguro a menos que defina "seguro" para significar "funciona en mi compilador".

+0

¿No estaría bien suponer que el vector de cualquier puntero tiene la misma estructura después de que todas son solo direcciones? O puede la estructura realmente cambiar debido al tipo de puntero. – user1353535

+3

@ user1353535: No, la implementación de la biblioteca es gratuita para especializar la plantilla como quiera. No es necesario que las diferentes especializaciones sean compatibles con el diseño. –

+0

Entonces, si es un tipo definido por el usuario que la biblioteca no puede especializarse, ¿entonces? – user1353535

Cuestiones relacionadas