Estilos de sintaxis de C++ cast


Una pregunta relacionada con el Regular del reparto vs static_cast vs dynamic_cast:

¿Qué estilo de sintaxis de cast prefiere en C++?

  • C-style cast sintaxis: (int)foo
  • Sintaxis de cast de estilo C++: static_cast<int>(foo)
  • sintaxis del constructor: int(foo)

Pueden no traducirse exactamente a las mismas instrucciones (¿lo hacen?) pero su efecto debe ser el mismo (¿verdad?).

Si solo estás haciendo casting entre los tipos numéricos incorporados, encuentro cast al estilo C++ sintaxis demasiado detallada. Como un antiguo codificador de Java tiendo a usar sintaxis de cast de estilo C en su lugar, pero mi gurú local de C++ insiste en usar sintaxis de constructor.

¿Qué piensas?

Author: Community, 2008-08-28

10 answers

Es una buena práctica nunca usar moldes de estilo C por tres razones principales:

  • como ya se mencionó, no se realiza ninguna comprobación aquí. El programador simplemente no puede saber cuál de los varios moldes se utiliza que debilita la escritura fuerte
  • los nuevos moldes son visualmente impactantes intencionalmente. Dado que los casts a menudo revelan una debilidad en el código, se argumenta que hacer que los casts sean visibles en el código es algo bueno.
  • esto es especialmente cierto si se buscan moldes con un herramienta automatizada. Encontrar moldes de estilo C de manera confiable es casi imposible.

Como palm3D señaló:

Encuentro la sintaxis de cast al estilo C++demasiado detallada.

Esto es intencional, por las razones dadas anteriormente.

La sintaxis del constructor (nombre oficial: function-style cast) es semánticamente la misma que la C-style cast y debe evitarse también (excepto para inicializaciones de variables en la declaración), por las mismas razones. Es discutible si esto debería ser cierto incluso para tipos que definen constructores personalizados, pero en C++ efectivo, Meyers argumenta que incluso en esos casos debe abstenerse de usarlos. Para ilustrar:

void f(auto_ptr<int> x);

f(static_cast<auto_ptr<int> >(new int(5))); // GOOD
f(auto_ptr<int>(new int(5));                // BAD

El static_cast aquí llamará al constructor auto_ptr.

 49
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-28 18:08:04

De acuerdo con Stroustrup :

Se introdujeron los "moldes de nuevo estilo" para dar a los programadores la oportunidad de declarar sus intenciones más claras y para el compilador para capturar más errores.

Así que en realidad, es por seguridad, ya que hace una comprobación adicional en tiempo de compilación.

 12
Author: hometoast,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 13:07:28

Con respecto a este tema, estoy siguiendo las recomendaciones hechas por Scott Meyers (C++ Más efectivo, Ítem 2: Prefiera los casts de estilo C++).

Estoy de acuerdo en que los cast de estilo C++ son detallados, pero eso es lo que me gusta de ellos : son muy fáciles de detectar y hacen que el código sea más fácil de leer (lo cual es más importante que escribir).

También te obligan a pensar en qué tipo de reparto necesitas, y a elegir el correcto, reduciendo el riesgo de errores. Se también le ayuda a detectar errores en tiempo de compilación en lugar de en tiempo de ejecución.

 5
Author: Jérôme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 13:19:32

Utilizo static_cast por dos razones.

  1. Está explícitamente claro lo que está sucediendo. No puedo leer eso sin darme cuenta de que hay un yeso en marcha. Con los yesos de estilo C, el ojo puede pasar directamente sobre él sin pausa.
  2. Es fácil buscar cada lugar en mi código donde estoy lanzando.
 2
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 13:16:29

Definitivamente estilo C++. El tecleo adicional te ayudará a evitar que hagas casting cuando no deberías: -)

 2
Author: Ben Collins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 13:17:26

Sintaxis de conversión de estilo C, no verifique el error. C++-style cast syntax, hace algunas comprobaciones. Al usar static_cast, incluso si no hace chequeo, al menos sabes que debes ser cuidadoso aquí.

 1
Author: CiNN,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 13:04:20

El reparto al estilo C es el peor camino a seguir. Es más difícil de ver, no se puede compaginar, combina diferentes acciones que no deberían combinarse, y no puede hacer todo lo que los casts de estilo C++pueden hacer. Realmente deberían haber eliminado los moldes de estilo C del lenguaje.

 1
Author: DrPizza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-28 13:11:10

Actualmente usamos moldes de estilo C en todas partes. Hice la otra pregunta casting, y ahora veo la ventaja de usar static_cast en su lugar, si no es por otra razón que es "greppable" (me gusta ese término). Probablemente empezaré a usar eso.

No me gusta el estilo C++; se parece demasiado a una llamada a una función.

 1
Author: Graeme Perrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:26

Opte por el estilo C++ y, peor aún, los feos fragmentos de código verbosos que componían el encasillamiento explícito de C++serán un recordatorio constante de lo que todos sabemos (es decir, el casting explícito es malo the el plomo a la moneda de improperios). No vaya con el estilo C++ si desea dominar el arte de rastrear errores de tiempo de ejecución.

 1
Author: CAH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-26 21:18:30

La sintaxis del constructor. C++ es OO, los constructores existen, yo los uso. Si siente la necesidad de anotar estos ctor de conversión, debe hacerlo para cada tipo, no solo para los integrados. Tal vez use la palabra clave 'explicit' para los ctors de conversión, pero la sintaxis del cliente imita exactamente lo que hace la sintaxis de ctor para los tipos integrados. Al ser greppable, eso puede ser cierto, pero qué gran sorpresa que escribir más caracteres facilita las búsquedas. ¿Por qué tratarlos como especiales? Si estás escribiendo fórmulas matemáticas con un montón de int / unsigned/... hacia y desde double/float - graphics - y necesita escribir un static_cast cada vez, el aspecto de la fórmula se desordena y es muy ilegible. Y es una batalla cuesta arriba de todos modos, ya que muchas veces te convertirás sin siquiera darte cuenta de que lo eres. Para los punteros de downcasting uso static_cast ya que, por supuesto, no existe ctor por defecto que lo haga.

 1
Author: QBziZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-23 14:48:58