¿Debo usar static_cast o reinterpret_cast al castigar a un vacío * a lo que sea -- ++ campo con pointers campo con static-cast campo con reinterpret-cast camp Relacionados El problema

Should I use static_cast or reinterpret_cast when casting a void* to whatever


217
vote

problema

Español

Tanto static_cast y reinterpret_cast parecen funcionar bien para fundir void* a otro tipo de puntero. ¿Hay alguna buena razón para favorecer a uno sobre el otro?

Original en ingles

Both static_cast and reinterpret_cast seem to work fine for casting void* to another pointer type. Is there a good reason to favor one over the other?

           
   
   

Lista de respuestas

169
 
vote

use static_cast : es el elenco más estrecho que describe exactamente qué conversión se realiza aquí.

Hay una idea errónea de que usar reinterpret_cast sería una mejor coincidencia porque significa "ignorar completamente la seguridad del tipo y simplemente emitir de A a B".

Sin embargo, esto no describe realmente el efecto de un reinterpret_cast . Más bien, reinterpret_cast tiene una serie de significados, para todos los cuales sostiene que "la asignación realizada por reinterpret_cast está definida por la implementación". [5.2.10.3]

Pero en el caso particular de la fundición de void* a T* La asignación está completamente bien definida por el estándar; a saber, para asignar un tipo a un puntero sin tipos sin cambiar su dirección.

Esta es una razón para preferir static_cast .

Además, y posiblemente sea más importante, es el hecho de que cada uso de reinterpret_cast está francamente peligroso porque convierte algo a cualquier otra cosa realmente (para los punteros), mientras que 9988777669 Es mucho más restrictivo, lo que proporciona un mejor nivel de protección. Esto ya me ha salvado de los bichos donde accidentalmente intenté coaccionar un tipo de puntero en otro.

 

Use static_cast: it is the narrowest cast that exactly describes what conversion is made here.

Therexe2x80x99s a misconception that using reinterpret_cast would be a better match because it meansxc2xa0xe2x80x9ccompletely ignore type safety and just cast from A to Bxe2x80x9d.

However, this doesnxe2x80x99t actually describe the effect of a reinterpret_cast. Rather, reinterpret_cast has a number of meanings, for all of which holds that xe2x80x9cthe mapping performed by reinterpret_cast is implementation-defined.xe2x80x9d [5.2.10.3]

But in the particular case of casting from void* to T* the mapping is completely well-defined by the standard; namely, to assign a type to a typeless pointer without changing its address.

This is a reason to prefer static_cast.

Additionally, and arguably more important, is the fact that every use of reinterpret_cast is downright dangerous because it converts anything to anything else really (for pointers), while static_cast is much more restrictive, thus providing a better level of protection. This has already saved me from bugs where I accidentally tried to coerce one pointer type into another.

 
 
11
 
vote

Esta es una pregunta difícil. Por un lado, Konrad realiza un excelente punto sobre la definición de especificaciones para reinterpret_cast , aunque en la práctica probablemente haga lo mismo. Por otro lado, si está lanzando entre los tipos de punteros (como es bastante común al indexar en la memoria a través de un char *, por ejemplo), static_cast generará un error del compilador y se le forzará usar reinterpret_cast de todos modos.

En la práctica, uso reinterpret_cast porque es más descriptivo de la intención de la operación del reparto. Ciertamente, podría hacer un caso para un operador diferente para designar solo reinterprense de punteros (que garantizó la misma dirección devuelta), pero no se encuentra uno en el estándar.

 

This is a tough question. On the one hand, Konrad makes an excellent point about the spec definition for reinterpret_cast, although in practice it probably does the same thing. On the other hand, if you're casting between pointer types (as is fairly common when indexing in memory via a char*, for example), static_cast will generate a compiler error and you'll be forced to use reinterpret_cast anyway.

In practice I use reinterpret_cast because it's more descriptive of the intent of the cast operation. You could certainly make a case for a different operator to designate pointer reinterprets only (which guaranteed the same address returned), but there isn't one in the standard.

 
 
   
   
1
 
vote

Sugiero usar el reparto más débil posible siempre.

reinterpret_cast0 se puede usar para fundir un puntero a un reinterpret_cast11111. Cuanto más estructura, rompa el elenco, más atención lo requiere.

En el caso de reinterpret_cast2 , usaría el reparto de estilo C, hasta que tengamos un reinterpret_cast3 , porque es más débil y nada más es suficiente.

 

I suggest using the weakest possible cast always.

reinterpret_cast may be used to cast a pointer to a float. The more structure-breaking the cast is, the more attention using it requires.

In case of char*, I'd use c-style cast, until we have some reinterpret_pointer_cast, because it's weaker and nothing else is sufficient.

 
 
         
         
-9
 
vote

Mi preferencia personal se basa en la alfabetización de código como esta:

  reinterpret_cast4  

o

  reinterpret_cast5  

Ambos hacen lo mismo al final, pero STATIC_CAST parece más apropiado en un entorno medio, la aplicación, mientras que la reinterpreta el reparto parece más a algo que verías en una biblioteca de nivel inferior IMHO.

 

My personal preference is based on code literacy like this:

void* data = something; MyClass* foo = reinterpret_cast<MyClass*>(data); foo->bar(); 

or

typedef void* hMyClass; //typedef as a handle or reference hMyClass = something; const MyClass& foo = static_cast<MyClass&>(*hMyClass); foo.bar(); 

They both do the same in the end, but static_cast seems more appropriate in a middle-ware, app enviroment, while reinterpret cast seems more like something you'd see in a lower-level library IMHO.

 
 

Relacionados problema

0  (¿Cómo) puedo emitir entre un tipo agregado con un miembro y ese tipo de miembro?  ( How can i cast between an aggregate type with one member and that members typ ) 
¿Es posible hacer esto? struct compound_type { int member; }; void func() { compound_type foo {384}; int bar = sole_member_type_cast<int>(foo)...

4  Es reinterpret_cast <> seguro o indefinido en los tipos de SSE / AVX?  ( Is reinterpret cast safe or undefined on sse avx types ) 
es algo así como __m128 a = something; __m128i b = reinterpret_cast<__m128i>(a); Seguro o indefinido? Si no está definido, ¿al menos funcionará en todo...

2  ¿Cómo usar la reinterpretación del lanzamiento para la clase de plantilla interna? [duplicar]  ( How to use reinterpret cast for inner template class ) 
Esta pregunta ya tiene respuestas aquí : ¿dónde y por qué tengo que poner ¿La "plantilla" y las pala...

-3  Vector con reinterpret_cast  ( Vector with reinterpret cast ) 
El siguiente código inserta solo un valor al vector col . El código se extrae de la base de código DBMS (para importar archivos), específicamente, es de 1 ...

8  Reparto de Void * a Tipo * Usando C ++ Style Cast: Static_cast o reinterpret_cast  ( Cast from void to type using c style cast static cast or reinterpret cast ) 
Entonces, si su conversión de Void * para escribir * o desde Tipo * a Void *, si usa: void func(void *p) { Params *params = static_cast<Params*>(p); } ...

70  ¿Por qué no se compila esto?  ( Why doesnt this reinterpret cast compile ) 
Entiendo que reinterpret_cast es peligroso, solo estoy haciendo esto para probarlo. Tengo el siguiente código: int x = 0; double y = reinterpret_cast<dou...

8  C ++ ¿Cuándo deberíamos preferir usar un static_cast de dos encadenados sobre reinterpret_cast  ( C when should we prefer to use a two chained static cast over reinterpret cast ) 
En primer lugar, esto no es un duplicado de ¿Por qué tenemos reinterpret_cast en C ++ cuando dos encadenados estadic_cast pueden hacer su trabajo? . Sé que...

1  Lectura de 4 bytes desde el final de una matriz de caracteres  ( Reading 4 bytes from the end of a char array ) 
Si tengo una matriz de caracteres: </div><script type="text/javascript"> $(document).on('pageinit', '#login', function(){ $(document).on('click', ...

0  Winsock REBV da 10014 error  ( Winsock recv gives 10014 error ) 
Voy a empezar con el código: typedef std::vector<unsigned char> CharBuf; static const int RCV_BUF_SIZE = 1024; SOCKET m_socket = a connected and workin...

4  Haz tipos de clase intercambiables solo a través de la fundición del puntero, sin tener que asignar ningún objeto nuevo?  ( Make interchangeable class types via pointer casting only without having to all ) 
update : Aprecio "No quiero eso, quiere esto en su lugar" sugerencias. Son útiles, especialmente cuando se proporcionan en contexto de la Motivando el escen...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos