Je ne trouve pas beaucoup d'informations sur const_cast
. La seule information que j'ai pu trouver (sur Stack Overflow) est:
Le
const_cast<>()
est utilisé pour ajouter / supprimer const (ness) (ou volatile-ness) d'une variable.
Cela me rend nerveux. L'utilisation d'un const_cast
comportement pourrait-elle provoquer un comportement inattendu? Si oui, quoi?
Sinon, quand est-il possible de l'utiliser const_cast
?
c++
casting
const-cast
Roader Mag
la source
la source
const
objet d' origine via uneconst
référence / un pointeur dé- dé- . Si, à la place, vous ne faites queconst_cast
contourner une API mal spécifiée (ou, dans mon cas, paresseuse) qui n'accepte qu'une non-const
référence mais qui ne sera utilisée que dans desconst
méthodes ... aucun problème.Réponses:
const_cast
est sûr uniquement si vous lancez une variable qui n'était pas à l'origineconst
. Par exemple, si vous avez une fonction qui prend un paramètre d'unconst char *
et que vous transmettez un modifiablechar *
, vous pouvezconst_cast
retourner ce paramètre en toute sécurité à achar *
et le modifier. Cependant, si la variable d'origine était en faitconst
, alors l'utilisationconst_cast
entraînera un comportement indéfini.la source
§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
N'importe quelle tentative ! Il n'y a pas de mots sur la variable d'origine.const_cast
pour supprimerconst
quelque chose qui a été initialement déclaréconst
. Mais il est UB d'essayer effectivement d'écrire à cet objet. Tant que vous venez de lire, tout va bien etconst_cast
cela ne cause pas d'UB. C'est une idée horrible, mais ce n'est pas intrinsèquement UB.Je peux penser à deux situations où const_cast est sûr et utile (il peut y avoir d'autres cas valides).
La première est lorsque vous avez une instance, une référence ou un pointeur const, et que vous souhaitez passer un pointeur ou une référence à une API qui n'est pas constante, mais que vous êtes CERTAIN que vous ne modifiez pas l'objet. Vous pouvez const_cast le pointeur et le transmettre à l'API, en sachant que cela ne changera vraiment rien. Par exemple:
L'autre est si vous utilisez un compilateur plus ancien qui n'implémente pas «mutable» et que vous souhaitez créer une classe qui est logiquement const mais pas au niveau du bit. Vous pouvez const_cast 'this' dans une méthode const et modifier les membres de votre classe.
la source
const_cast
pouvait provoquer un comportement indéfini, pas quelles applications utiles de celui-ci sontconst_cast
est une réponse valable. Il n'y a pashe
de questions car la question seule est le sujet.J'ai du mal à croire que ce soit la seule information que vous puissiez trouver sur const_cast. Citant le deuxième hit de Google :
la source
const_cast
. Ou appelez une méthode const dessus.Ce que dit Adam. Un autre exemple où const_cast peut être utile:
Nous ajoutons d'abord const au type
this
surgetT
lequel pointe, puis nous appelons la version const de , puis nous supprimons const du type de retour, qui est valide cart
doit être non-const (sinon, la version non-const degetT
ne pourrait pas avoir été appelé). Cela peut être très utile si vous avez un corps de fonction volumineux et que vous souhaitez éviter le code redondant.la source
const_cast
oustatic_cast
est mieux.const_cast
ne peut faire que ce que vous voulez: changer les qualificatifs cv.static_cast
peut effectuer «silencieusement» d'autres opérations que vous n'avez pas l'intention de faire. Cependant, le premier plâtre est entièrement sûr et astatic_cast
tendance à être plus sûr queconst_cast
. Je pense que c'est une situation où leconst_cast
communique mieux votre intention, mais lestatic_cast
communique mieux la sécurité de vos actions.La réponse courte est non, ce n'est pas sûr.
La réponse longue est que si vous en savez assez pour l'utiliser, alors il devrait être sûr.
Lorsque vous lancez un casting, vous dites essentiellement: "Je sais quelque chose que le compilateur ne sait pas." Dans le cas de const_cast, ce que vous dites est: "Même si cette méthode prend une référence ou un pointeur non-const, je sais que cela ne changera pas le paramètre que je lui passe."
Donc, si vous savez vraiment ce que vous prétendez savoir en utilisant le casting, alors vous pouvez l'utiliser.
la source
Vous détruisez toute chance de sécurité des threads, si vous commencez à modifier des choses que le compilateur pensait const.
la source
const
.const
est la confiance.const_cast
brise cette confiance :(source: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fkeyword_const_cast.htm
la source