No puedo encontrar mucha información sobre const_cast
. La única información que pude encontrar (en Stack Overflow) es:
Se
const_cast<>()
utiliza para agregar / eliminar la const (ness) (o volatile-ness) de una variable.
Esto me pone nervioso. ¿El uso de un const_cast
comportamiento podría causar un comportamiento inesperado? ¿Entonces qué?
Alternativamente, ¿cuándo está bien usarlo const_cast
?
c++
casting
const-cast
Mag Roader
fuente
fuente
const
objeto original a través de unaconst
referencia / puntero de -ed. Si, en cambio, simplemente está tratandoconst_cast
de evitar una API especificada deficientemente (o, en mi caso, perezosa) que solo acepta una noconst
referencia pero solo se usará enconst
métodos ... no hay problema en absoluto.Respuestas:
const_cast
es seguro solo si está lanzando una variable que originalmente no eraconst
. Por ejemplo, si tiene una función que toma un parámetro de aconst char *
, y pasa un modificablechar *
, es seguro queconst_cast
ese parámetro vuelva a achar *
y lo modifique. Sin embargo, si la variable original era de hechoconst
, el usoconst_cast
resultará en un comportamiento indefinido.fuente
§7.1.5.1/4 says Except that any class member declared mutable (7.1.1) can be modified, any attempt to modify a const object during its lifetime (3.8) results in undefined behavior
¡Cualquier intento ! No hay palabras sobre la variable original.const_cast
para eliminarconst
de algo que fue declarado inicialmenteconst
. Pero es UB intentar escribir en ese objeto. Siempre que lea, está bien y el problemaconst_cast
en sí mismo no causa UB. Es una idea horrible, pero no es inherentemente UB.Puedo pensar en dos situaciones en las que const_cast es seguro y útil (puede haber otros casos válidos).
Una es cuando tiene una instancia, referencia o puntero constante, y desea pasar un puntero o referencia a una API que no es correcta const, pero está SEGURO de que no modificará el objeto. Puede const_cast el puntero y pasarlo a la API, confiando en que realmente no cambiará nada. Por ejemplo:
La otra es si está utilizando un compilador más antiguo que no implementa 'mutable', y desea crear una clase que sea lógicamente constante pero no bit a bit. Puede const_cast 'this' dentro de un método const y modificar miembros de su clase.
fuente
const_cast
puede causar un comportamiento indefinido, no qué aplicaciones útiles sonconst_cast
es una respuesta válida. No hayhe
preguntas, ya que la pregunta es el tema.Me cuesta creer que esa sea la única información que pueda encontrar sobre const_cast. Citando del segundo éxito de Google :
fuente
const_cast
. O llame a un método const en él.Lo que dice Adam. Otro ejemplo en el que const_cast puede ser útil:
Primero agregamos const al tipo
this
apunta a, luego llamamos a la versión const degetT
, y luego eliminamos const del tipo de retorno, que es válido ya quet
debe ser no constante (de lo contrario, la versión no constante degetT
no podría tener ha sido llamado). Esto puede resultar muy útil si tiene un cuerpo de función grande y desea evitar el código redundante.fuente
const_cast
o sistatic_cast
es mejor.const_cast
solo puedes hacer lo que quieras: cambiar los calificadores cv.static_cast
puede realizar 'silenciosamente' otras operaciones que no tiene la intención. Sin embargo, el primer yeso es completamente seguro ystatic_cast
tiende a ser más seguro queconst_cast
. Creo que esta es una situación en la queconst_cast
comunica mejor su intención, perostatic_cast
comunica mejor la seguridad de sus acciones.La respuesta corta es no, no es seguro.
La respuesta larga es que si sabe lo suficiente para usarlo, entonces debería ser seguro.
Cuando estás transmitiendo, lo que esencialmente estás diciendo es: "Sé algo que el compilador no sabe". En el caso de const_cast, lo que está diciendo es: "Aunque este método toma una referencia o un puntero no constante, sé que no cambiará el parámetro que le paso".
Entonces, si realmente sabe lo que dice saber al usar el yeso, entonces está bien usarlo.
fuente
Está destruyendo cualquier posibilidad de seguridad de subprocesos, si comienza a modificar cosas que el compilador pensaba que eran constantes.
fuente
const
.const
es la confianza.const_cast
está rompiendo esa confianza :(fuente: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fkeyword_const_cast.htm
fuente