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?
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". –
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". –