casting non const à const en c++
Je sais que vous pouvez utiliser const_cast
de jeter un const
à un non-const
.
Mais que devriez-vous utiliser si vous voulez jeter de non-const
à const
?
Vous devez vous connecter pour publier un commentaire.
const_cast
peut être utilisé afin de supprimer ou ajouter constness à un objet. Cela peut être utile quand vous voulez parler à une certaine surcharge.Exemple artificiel:
const_cast
doit avoir un constructeur pour l'utilisateur types de classe.const_cast<const Type*>
pour ajouter leconst
qualificatif -- ce faire est de 10+ caractères supplémentaires de bruit visuel et donc, cette pratique est de l'OMI une Mauvaise Idée™. Utilisez simplementconst foo* = obj;
.const_cast
est le plus souvent (ab)utilisé pour prendreconst
loin.const_cast
est mauvais pour cela: à l'aide deconst_cast
de cette façon est utile dans le cadre d'un constructeur d'initialisation de membre, où vous ne pouvez pas faire une variable locale à ajouter const. En outre, je dirais que le "bruit visuel" aide à le rendre évident que quelque chose d'inhabituel se passe concernant la const-ness. Cependant, il est probablement préférable d'ajouter un commentaire pour préciser que vous êtes ajout const, afin que les gens ne sont pas instinctivement à s'en prendre à la malconst_cast
.static_cast<const VarType>(var)
. Personnellement, je ne l'utilise presque pas const_cast comme il est principalement fait pour les logiciels d'architecture des failles dans votre code (quand il est utilisé pour éloigner le constness). Donc, lors de l'ajout d'constness j'utilise soit la variable locale approche ou un static_cast de signal il n'y a rien de louche passeVous n'avez pas besoin
const_cast
pour ajouterconst
ness:Veuillez lire attentivement ce la question et la réponse pour plus de détails.
TSL depuis C++17 fournit maintenant
std::as_const
exactement dans ce cas.Voir: http://en.cppreference.com/w/cpp/utility/as_const
Utilisation:
Au lieu de:
Vous pouvez utiliser un
const_cast
si vous le souhaitez, mais ce n'est pas vraiment nécessaire: non-const peut être converti const implicitement.const
àconst
est pas fiable. Parfois, il a besoin d'être explicite. Par exemple, une méthode qui permettrait de distinguer entre unconst
et nonconst
version d'un paramètre pour retourner unvector
dereference_wrapper
deconst
ness. Considérons par exemple cette déclaration:template<typename Image> vector<reference_wrapper<typename conditional<is_const<Image>::value, const typename Image::celltype, typename Image::celltype>::type>> get_subimage(int, int, Image&);
.Vous avez une conversion implicite si vous passez un non const argument à une fonction qui a un paramètre const
const_cast
peut être utilisé pour ajouterconst
ness comportement trop.De cplusplus.com:
const_cast
pascosnt_cast
. Ne peut modifier que j'aurais à changer à moins de 10 char :/