¿Podría alguien explicar las diferencias?static_cast <int> (foo) vs. (int) foo
Respuesta
La diferencia es que (int) foo puede significar media docena de cosas diferentes. que podría ser una static_cast (convertir entre tipos estáticamente conocidos), que podría ser una const_cast (adición o eliminación de const-dad), o podría ser un reinterpret_cast (conversión entre tipos de puntero)
El compilador trata cada uno de ellos hasta que encuentre uno que funcione. Lo que significa que puede que no siempre elija el que espera, por lo que puede convertirse en una fuente sutil de errores.
Además, static_cast es mucho más fácil de buscar o buscar/reemplazar.
(int) foo se compara más a C++ reinterpret_cast<int>
, es decir, no se verifica la validez del elenco.
http://www.velocityreviews.com/forums/t280611-reinterpretcastltgt-v-staticcastltgt.html expanins la diferencia entre static_cast y reinterpret_cast –
No, se compara con una combinación de todas las versiones de C++. Realizará el primer tipo de lanzamiento que sea válido. – jalf
Es cierto, excepto que dynamic_cast no está incluido. –
Mira lo Stroustrup has to say about that, incluyendo las siguientes:
Debido a que la conversión de estilo C (T) se puede utilizar para expresar muchas operaciones diferentes, lógicamente, el compilador sólo tiene la oportunidad de atrapar los malos usos más pelado. [...]
Los "modelos nuevos" se introdujeron para dar a los programadores la oportunidad de expresar sus intenciones con mayor claridad y para que el compilador capte más errores. [...]
En particular, C++ hace la distinción entre static_cast
y reinterpret_cast
:
La idea es que las conversiones permitidas por static_cast son algo menos probable que conduzca a errores que los que requieren reinterpret_cast . En principio, es posible usar el resultado de un static_cast sin devolverlo a su tipo original, mientras que siempre debe convertir el resultado de un reinterpret_cast a su tipo original antes de usarlo para garantizar la portabilidad.
- 1. char * foo vs char * foo
- 2. ¿Qué significa esto? int foo = foo + 4;
- 3. Referencia estándar para int foo = foo
- 4. var foo = foo || alerta (foo);
- 5. Scala: 'foo def = {1}' vs 'foo def {1}'
- 6. R: apt-get install r-cran-foo vs. install.packages ("foo")
- 7. polimorfismo C++ ((X *) y) -> foo() vs ((X) * y) .foo()
- 8. Foo f = Foo(); // no hay función de coincidencia para la llamada a 'Foo :: Foo (Foo)' ... ¿eh?
- 9. 'var foo = función ...' y 'la función foo() ...'
- 10. La conversión de "foo <T>" a "foo const <const T>" - C++
- 11. Foo no se puede convertir a Foo
- 12. Cómo analizar <foo value1 = "a" value2 = "b"> value3</foo> con JAXB?
- 13. std :: unordered_set <Foo> como miembro de la clase Foo
- 14. ¿Cómo se llama IEnumerable <Foo>?
- 15. Redondeo con static_cast <int>?
- 16. ¿Cómo puedo convertir MultiMap <Integer, Foo> en Map <Integer, Set <Foo>> usando Guava?
- 17. ¿Cuáles son las ventajas comparativas de glob ('foo *') sobre <foo*>?
- 18. Diferencia entre <T extends A> void foo (T t) y void foo (A a)
- 19. Absoluto ("/ foo") y relativo ("../foo") nombres de archivo. ¿Cómo se llama la categoría "foo"?
- 20. Diferencia entre "struct foo *" y "foo *" donde foo es una estructura?
- 21. ¿Por qué Amazon S3 no sirve automáticamente /foo/index.html cuando solicito/foo o/foo /?
- 22. ¿Hay alguna diferencia entre [& foo] {...} captura y [foo] {...} captura si 'foo' es una variable de referencia?
- 23. ¿qué métodos realmente invocan `foo <bar <baz`?
- 24. Usando el diccionario <Foo, Foo> en lugar de la lista <Foo> para acelerar las llamadas a los contenedores()
- 25. Es Foo * f = new Foo buen código de C++
- 26. jQuery $ each (arr, foo) contra $ (arr) .Cada (foo)
- 27. Diferencia entre clase foo y clase foo (objeto) en Python
- 28. ¿De qué sirve decir "#define FOO FOO" en C?
- 29. ¿Hay alguna diferencia entre "foo is None" y "foo == None"?
- 30. ¿Cuándo os.environ ['foo'] no coincide con os.getenv ('foo')?
duplicado exacto de http://stackoverflow.com/questions/103512/in-c-why-use-staticcastintx-instead-of-intx – jalf
Gracias por el enlace, jalf. –