Yo tengo:
unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));
El error: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’
¿Cuál es la forma correcta de emitir aquí en estilo C ++?
Yo tengo:
unsigned char *foo();
std::string str;
str.append(static_cast<const char*>(foo()));
El error: invalid static_cast from type ‘unsigned char*’ to type ‘const char*’
¿Cuál es la forma correcta de emitir aquí en estilo C ++?
Respuestas:
reinterpret_cast
basic formatting
.
char *
y const unsigned char *
se consideran tipos no relacionados. Entonces quieres usar reinterpret_cast
.
Pero si va a pasar de const unsigned char*
un const
tipo que no es, debe usar const_cast
primero. reinterpret_cast
no puede desechar una calificación const
o volatile
.
char
, a signed char
y an unsigned char
ocupan la misma cantidad de almacenamiento y tienen el mismo requisito de alineación". Esta ES una relación. O aquí hay un enlace más legible: en.cppreference.com/w/cpp/language/types#Character_types
unsigned char * es básicamente una matriz de bytes y debe usarse para representar datos brutos en lugar de una cadena en general. Una cadena Unicode se representaría como wchar_t *
De acuerdo con el estándar C ++, un reinterpret_cast entre unsigned char * y char * es seguro ya que son del mismo tamaño y tienen la misma construcción y restricciones. Intento evitar reintrepret_cast incluso más que const_cast en general.
Si la transmisión estática falla con lo que está haciendo, es posible que desee reconsiderar su diseño porque, francamente, si está usando C ++, es posible que desee aprovechar lo que ofrece la parte "plus plus" y usar clases de cadena y STL (también conocido como std :: basic_string podría funcionar mejor para ti)
Debería usar un reinterpret_cast<>
ya que los dos tipos entre los que está lanzando no están relacionados entre sí.
Demasiados comentarios para hacer a diferentes respuestas, así que dejaré otra respuesta aquí.
Puedes y debes usar reinterpret_cast<>
, en tu caso
str.append(reinterpret_cast<const char*>(foo()));
porque, si bien estos dos son tipos diferentes, el capítulo de la norma de 2014 3.9.1 Fundamental types [basic.fundamental]
dice que existe una relación entre ellos:
Llano
char
,signed char
yunsigned char
tres tipos distintos, denominados colectivamente tipos de caracteres estrechos. Achar
,signed char
ay aunsigned char
ocupan la misma cantidad de almacenamiento y tienen los mismos requisitos de alineación (3.11); es decir, tienen la misma representación de objeto.
(la selección es mía)
Aquí hay un enlace disponible: https://en.cppreference.com/w/cpp/language/types#Character_types
El uso wchar_t
de cadenas Unicode / multibyte está desactualizado: ¿Debería usar wchar_t cuando uso UTF-8?