Est const_cast sûr?
Je ne trouve pas beaucoup d'informations sur const_cast
. La seule info que j'ai pu trouver (sur Stack Overflow) est:
La
const_cast<>()
est utilisé pour ajouter, supprimer const(ness) (ou volatile-ness) d'une variable.
Ce qui me rend nerveux. Pourrait à l'aide d'un const_cast
provoquer un comportement inattendu? Si oui, quoi?
Sinon, quand est-il acceptable d'utiliser const_cast
?
- La réponse sommet surplombe quelque chose qui pourrait être terriblement évident, mais il est utile de préciser: Il ne devient dangereux si vous tentez de modifier une origine
const
objet par l'intermédiaire d'un de-const
-ed de référence/pointeur. Si, au lieu de cela, vous êtes simplementconst_cast
ing de travailler autour d'un mal (ou, dans mon cas, paresseusement) spec'd API que seule la proposition a été accepté un non-const
de référence, mais ne seront utilisées que dansconst
méthodes... pas de problème que ce soit. - De manière plus précise la version de la question (et la réponse) qui couvre ce qui est: Est-il permis d'éloigner le const sur un const objet défini, tant qu'il n'est pas réellement modifié?
Vous devez vous connecter pour publier un commentaire.
const_cast
est sûr que si vous êtes à la coulée d'une variable a été à l'origine de la non-const
. Par exemple, si vous avez une fonction qui prend un paramètre d'unconst char *
, et que vous passez dans une modifiableschar *
, il est sûr deconst_cast
que le paramètre de retour à unchar *
et de le modifier. Toutefois, si la variable d'origine était en faitconst
, puis à l'aideconst_cast
entraînera un comportement indéfini.§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
Toute tentative! Il n'existe pas de mots à propos de la variable d'origine.const
référence à un non-const
objet. J'ai passé une référence à un membre de l'objet à une fonction qui a été utiliséeconst_cast
pour modifier la valeur. Le compilateur a décidé de passer une référence à une temporaire sur la pile au lieu de cela, et donc le changement n'a jamais été faite à l'origine.const_cast
ing loinconst
ne fonctionne pas correctement, même si la variable d'origine n'a PAS étéconst
. Il pourrait être argumenté que c'est un optimiseur de bug, mais un bug ou pas, il a causé un problème. La norme semble également à l'appui de l'affirmation selon laquelle cela ne devrait pas être fait.Only in the case of a const reference parameter (not a const pointer parameter) is the compiler allowed to silently make a copy (§5.2.2/5)
de son commentaire.const_cast
pour supprimerconst
de quelque chose qui a été initialement déclaréconst
. Mais il est UB à essayer d'écrire à cet objet. Aussi longtemps que vous venez de lire vous sont fines et laconst_cast
en lui-même ne cause pas de UB. C'est une idée horrible, mais ce n'est pas intrinsèquement UB.Je pense à deux situations où const_cast est utile et sans danger (il y a peut être d'autres cas valides).
C'est quand vous avez un const exemple, de référence ou pointeur, et que vous souhaitez passer un pointeur ou une référence à une API qui n'est pas const-correct, mais que vous êtes CERTAIN de ne pas modifier l'objet. Vous pouvez const_cast le pointeur et le transmettre à l'API, en espérant qu'il ne sera pas vraiment changer quoi que ce soit. Par exemple:
L'autre est si vous utilisez un vieux compilateur de ne pas mettre en oeuvre une "mutables", et vous souhaitez créer une classe qui est logiquement const mais pas au niveau du bit const. Vous pouvez const_cast " il " au sein d'un const méthode et de modifier les membres de votre classe.
const_cast
peut provoquer un comportement non défini, non pas ce que les applications utiles sontJ'ai du mal à croire que c'est la seulement informations que vous pourriez trouver sur const_cast. Citant le deuxième Google a frappé:
const_cast
. Ou appeler un const méthode.Ce que dit Adam. Un autre exemple où const_cast peut être utile:
Nous avons d'abord ajouter const pour le type
this
points, puis nous appelons la const version degetT
, et puis on enlève const du type de retour, ce qui est valable depuist
doit être non-const (dans le cas contraire, la non-const version degetT
ne pouvait pas avoir été appelé). Cela peut être très utile si vous avez un grand corps de la fonction et que vous voulez éviter de code redondant.const_cast
oustatic_cast
est mieux.const_cast
ne peut faire ce que vous voulez: changer le cv-qualificatifs.static_cast
peut "silencieusement" effectuer d'autres opérations que vous n'avez pas l'intention. Cependant, la première distribution est entièrement sécuritaire, etstatic_cast
a tendance à être plus sûr queconst_cast
. Je pense que c'est une situation où laconst_cast
communique votre intention mieux, mais lestatic_cast
communique la sécurité de vos actions mieux.La réponse courte est non, il n'est pas sûr.
La réponse longue est que si vous en savez assez pour l'utiliser, alors il doit être sûr.
Lorsque vous êtes à la coulée, ce que vous êtes essentiellement en disant, "je sais quelque chose que le compilateur ne sait pas." Dans le cas de const_cast, ce que vous dites se, "Même si cette méthode prend en non-const de référence ou un pointeur, je sais que cela ne va pas changer le paramètre-je le laisser passer."
Donc, si vous ne savez vraiment ce que vous réclamez à savoir à l'aide de la fonte, puis c'est bien de l'utiliser.
Vous êtes détruire toute chance au fil de sécurité, si vous commencer à modifier les choses, que le compilateur de la pensée ont été const.
const
.const
est la confiance.const_cast
est briser cette confiance 🙁source: http://publib.boulder.ibm.com/infocenter/comphelp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8a.doc%2Flanguage%2Fref%2Fkeyword_const_cast.htm