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 consttipo que no es, debe usar const_castprimero. reinterpret_castno puede desechar una calificación consto volatile.
char, a signed chary an unsigned charocupan 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 charyunsigned chartres tipos distintos, denominados colectivamente tipos de caracteres estrechos. Achar,signed charay aunsigned charocupan 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_tde cadenas Unicode / multibyte está desactualizado: ¿Debería usar wchar_t cuando uso UTF-8?