¿Es cierto que const_cast es solo una forma de decirle al compilador "dejar de gemir, trátelo como un puntero sin const"? ¿Hay algún caso en el que const_cast se traduzca al código de máquina real?¿Const_cast causa emisión de código real alguna vez?
Respuesta
Posiblemente, podría haber arquitecturas donde un puntero const tuviera una representación diferente a una no const, en cuyo caso el compilador tendría que emitir algún código. Sin embargo, no conozco ninguna de tales arquitecturas.
Inteligente, pero no verdadero: const es solo un atributo, no significa que no pueda escribir (considere los miembros mutables). Si está concibiendo una arquitectura en la que los punteros de solo lectura y lectura-escritura o solo escritura son diferentes, entonces el código aún no se generará en el molde, sino en la escritura misma. – Suma
Intencionalmente no dije _cuando_ el compilador tendría que emitir algún código. –
No importa en absoluto. Const_cast woud eliminará el hipotético "bit de solo lectura" en el puntero, como lo haría escribir a un miembro mutable a través de un puntero const. El último puede ser detectado con 100% de precisión por el compilador. – MSalters
No, simplemente elimina el atributo const en tiempo de compilación.
const_cast simplemente descarta la constness de un atributo y nada más.
const
no cambia la representación de un tipo, en particular, la representación de T*
es exactamente la misma que T const*
.
considerar:
int i,
* const cpi = &i,
* const * pcpi = &cpi;
int const * const * pcpci = pcpi; // cpi is now int const*
La representación de cpi
al mismo tiempo representa un int*
y una int const*
través *pcpci
.
No hay forma de que la representación de cpi
cambie cuando se inicializa pcpci
.
Por supuesto, si los objetos del puntero tienen bits no significativos, el compilador puede voltearlos aleatoriamente; en particular, const_cast
puede voltear los bits no significativos de un puntero, pero cualquier conversión implícita también podría hacerlo. No creo que este caso exista en el mundo real.
Lo mismo ocurre cuando dos patrones de bits diferentes dan como resultado el mismo valor de dirección (base + desplazamiento cuando el desplazamiento es lo suficientemente grande).
- 1. ¿Es const_cast <const Type*> alguna vez útil?
- 2. ¿Alguna vez necesita escribir código real en lenguaje ensamblador?
- 3. const_cast VS mutable? ¿alguna diferencia?
- 4. Comportamiento indefinido con const_cast
- 5. const_cast vs static_cast
- 6. ¿Alguna vez ha usado un algoritmo genético en aplicaciones del mundo real?
- 7. ¿Es const_cast seguro?
- 8. ¿Las configuraciones VHDL avanzadas se utilizan alguna vez en la vida real?
- 9. fecha de emisión separador
- 10. ¿Cuál es la causa real del error de mysql 1442?
- 11. ¿Alguna vez ha utilizado efectivamente lexer/analizador en la aplicación real?
- 12. ¿Se ha usado alguna vez la "sustracción fingida" en el mundo real?
- 13. const_cast de un miembro de const estático
- 14. La paginación no funciona y tal vez encontré la causa
- 15. Código EF4: la primera causa InvalidOperationException
- 16. ¿Es necesario > alguna vez?
- 17. ¿Se desborda BigInteger alguna vez?
- 18. ¿Alguna vez ha usado ngen.exe?
- 19. Usos correctos de const_cast <>
- 20. Pregunta sobre const_cast en C++
- 21. ¿Es este comportamiento indefinido const_cast?
- 22. ¿Alguna vez alguien usa el Control Ribbon?
- 23. ¿Los ensamblados .NET alguna vez cambian?
- 24. AngularJS ¿se puede llamar a un método $ on más de una vez para una sola emisión $?
- 25. Linux de ping emisión interruptor
- 26. Cmd Python, emisión de subclases
- 27. UIGestureRecognizer y emisión UITableViewCell
- 28. ¿Alguna vez ha bloqueado el compilador?
- 29. ¿Cuándo, si alguna vez, debemos usar const?
- 30. blur vs focusout - ¿alguna diferencia real?
Sí, es cierto. – user51568