programacion - ventajas y desventajas del lenguaje c y c++




¿Hay alguna ventaja en el uso de static_cast en lugar de la fundición de estilo C para los tipos que no son de puntero? (3)

¿ static_cast usa static_cast para tipos no punteros solo para mantener la consistencia de la codificación?

No solo eso, sino también para ayudar a mantener la corrección y la compatibilidad futura.

Ayuda a mantener la corrección, ya que static_cast no puede hacer algunos lanzamientos que un molde de estilo C puede hacer. Esto ayuda si comete un error sobre algunos de los tipos involucrados, tal vez manejar un puntero mientras se convence de que es un número entero (y varias capas de plantillas y tipos, no es demasiado difícil de imaginar). Entonces, si pretendes un static_cast , escribe uno y obtienes un error en tiempo de compilación, se te static_cast inmediatamente que los tipos involucrados no son lo que pensabas que eran. Con la actitud de "todo vale" del elenco estilo C, no descubrirás el error a tiempo.

También ayuda con la compatibilidad futura. Si los tipos involucrados en el elenco cambian más adelante en el desarrollo, un static_cast informará un error en el que un elenco de estilo C simplemente cambiará su comportamiento silenciosamente (a algo que probablemente no sea el deseado).

Soy muy consciente de la ventaja de usar static_cast lugar de fundición estilo C para tipos de punteros.

Si los tipos de puntero son incompatibles, entonces:

  • static_cast producirá un error de tiempo de compilación en una línea específica dentro del código fuente
  • La conversión de estilo C puede generar un error de tiempo de ejecución en un punto "aleatorio" en la ejecución del programa

Pero no puedo encontrar ningún ejemplo similar para tipos que no sean punteros.

En otras palabras, ambos métodos de conversión arrojan el mismo resultado para los tipos que no son punteros.

¿Es correcto o me he perdido algo?

En caso afirmativo, ¿se usa static_cast para tipos que no son punteros solo para mantener la consistencia de la codificación?


¿static_cast se usa para tipos no punteros solo para mantener la coherencia de codificación?

No (bueno, sí, pero no solo).

También es fácil de encontrar / reemplazar. Esto es importante en caso de refactorizaciones, corrección de errores, etc.

Es una restricción en el tipo de reparto permitido: considere un ejemplo en el que tenga un molde estilo C (que funciona bien) en una variable, luego cambie la declaración de la variable lanzada, a algo que lo haga inválido (por ejemplo, , cambia int x; a void * const x; ).

El elenco de estilo C de repente realiza otra función (es decir, const_cast<...>(reinterpret_cast<...>(...) ) con el mismo código.

Si escribe el código inicial con un static_cast en lugar de un elenco de estilo C, el compilador le informará que static_cast no está realizando un lanzamiento estático.


Una ventaja que las otras dos respuestas no mencionaron aún es que static_cast es mucho más fácil de detectar. El significado de paréntesis es notoriamente sobrecargado en C ++ y puede ser difícil detectar yesos malvados (o incluso incorrectos). _cast embargo, cuando veo que algo termina en _cast , es como un golpe de velocidad mental: desacelero y compruebo cuidadosamente por qué el sistema de tipos está siendo subvertido.





compile-time