2011-02-09 25 views

Respuesta

7

Aunque puede no ser técnicamente 100% legal esto funcionará reinterpret_cast<unsigned char*>(buf).


La razón de que esto no es 100% técnicamente legal se debe a la sección 5.2.10 expr.reinterpret.cast bala 7.

Un puntero a un objeto se puede convertir explícitamente a un puntero a un objeto de una diferente tipo. el tipo original produce el valor del puntero original, el resultado de dicha conversión del puntero no está especificado.

Lo que significa que *reinterpret_cast<unsigned char*>(buf) = 'a' no está especificado, pero *reinterpret_cast<char*>(reinterpret_cast<unsigned char*>(buf)) = 'a' está bien.

+0

Si recuerdo correctamente el estándar, hay una excepción que dice que es legal usar el puntero a [[un] signed] char para acceder a la memoria de un objeto de cualquier tipo. Creo que hace que el comportamiento de tu código esté bien definido. – HolyBlackCat

+0

@HolyBlackCat No recuerdo ninguna de estas palabras, si pudiera proporcionar una referencia, actualizaré la respuesta. – Motti

+0

Desafortunadamente no puedo encontrar una referencia estándar. Pero encontré algunas afirmaciones en SO que hay una excepción a la regla de aliasing estricta para 'char *' (lo que significa que "es legal usar puntero a [[un] signed) char para acceder a la memoria de un objeto de cualquier tipo "). Vea esto: http://stackoverflow.com/a/99010/2752075 'Puede usar char * para aliasing <...>. Las reglas permiten una excepción para char * (incluyendo char firmado y char sin signo). Siempre se supone que char * aliases otros tipos. Sin embargo, esto no funcionará de la otra manera: no hay suposición de que su estructura alias un búfer de caracteres. – HolyBlackCat

4

¿Lo lanzó?

+4

en C++, "Solo eche" siempre necesita un descargo de responsabilidad :) – tenfour

+0

Heh-heh! Descargo de responsabilidad: esta respuesta está bien para el texto que muestra en la pregunta. No lo intente en arreglos de números de 8 bits con signo. – Dave

Cuestiones relacionadas