Tengo un problema causado por romper la regla de alias de puntero estricta. Tengo un tipo T
que viene de una plantilla y un tipo integral Int
del mismo tamaño (como con sizeof
). Mi código hace esencialmente las siguientes:Alias de puntero estricto: ¿alguna solución para un problema específico?
T x = some_other_t;
if (*reinterpret_cast <Int*> (&x) == 0)
...
Debido a que es un poco de T
arbitrario (que no sea la restricción de tamaño) tipo que pudiesen tener un constructor, no puedo hacer una unión de T
y Int
. (Esto solo está permitido en C++ 0x y aún no es compatible con GCC).
¿Hay alguna manera de reescribir el pseudocódigo anterior para preservar la funcionalidad y evitar romper la regla de aliasing estricta? Tenga en cuenta que esta es una plantilla, no puedo controlar T
o el valor de some_other_t
; la asignación y la comparación posterior ocurren dentro del código de plantilla.
(Para el registro, el código anterior empezó a romper en GCC 4.5 si T
contiene ningún campos de bits.)
¿Qué estás tratando de hacer? No puedo pensar en muchas situaciones en las que ese código sea significativo. Ciertamente no está bien especificado por el estándar. Asumiendo que este truco es realmente necesario (lo cual probablemente no es), puede que tenga que usar el indicador del compilador apropiado para deshabilitar el alias estricto. – jalf
@jalf: es un contenedor único. Marcaré las posiciones vacías con la integral 0. Sin embargo, dado que 'T' puede ser cualquier cosa, incluido el bit a bit 0, necesito marcar como máximo una posición como" no está vacía, aunque parezca vacía ". La comparación es la comprobación de si 'x' debe marcarse así o no. – doublep
No tengo claro cómo se está resolviendo este problema. ¿Cómo puede un 'reinterpret_cast' ignorar las dos razones diferentes para almacenar' 0'? – Stephen