IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

reinterpret_cast<type>, static_cast<type> ou (type)?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut reinterpret_cast<type>, static_cast<type> ou (type)?
    Bonsoir

    Après avoir lu cet article de la faq, je suis tombé sur un cas concret et je me trouvais embêté de ne pas savoir lequel choisir.

    voici une représentation de la classe en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A{
    public:
       explicit A(unsigned int);
    private:
       A(int);
    };
    Or pour certaines raisons, je veux dans une méthode de la classe appeler le premier constructeur alors que je manipule(peut-être) un int. La question est alors: lequel des trois codes est alors préférable ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       return A(static_cast<unsigned int>(mon_int));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       return A(reinterpret_cast<unsigned int>(mon_int));
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       return A((unsigned int)mon_int);

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    - Le premier effectuera la conversion de la valeur en unsigned int (ce que tu veux)
    - Le deuxième ne compile pas; mais imaginons qu'il compile : il ferait croire au compilateur qu'il y a un unsigned int à l'emplacement mémoire où se trouve en réalité un int -- tout ce qu'il faut pour récupérer une valeur incorrecte
    - Le troisième est dans tous les cas à éviter

  3. #3
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    - Le premier effectuera la conversion de la valeur en unsigned int (ce que tu veux)
    A la compilation ou à l'execution ?
    Citation Envoyé par Laurent Gomila Voir le message
    - Le deuxième ne compile pas
    Heu, je sait que la question peut paraître impertinente voir déplacée, mais... pourquoi ?
    Citation Envoyé par Laurent Gomila Voir le message
    il ferait croire au compilateur qu'il y a un unsigned int à l'emplacement mémoire où se trouve en réalité un int -- tout ce qu'il faut pour récupérer une valeur incorrecte
    En réalité, ce n'est pas une variable mais une opération qui est reinterpret_castée ce qui signifie que la variable en question est une variable qui sera effacée à la ligne suivante.
    Citation Envoyé par Laurent Gomila Voir le message
    - Le troisième est dans tous les cas à éviter
    Une fois encore, et en te priant d'excuser l'outrecuidante impétuosité dont je fais preuve dans mes ineptes interrogations, je me permettrais de réitérer, l'insolente, la succincte, l'enfantine et pourtant diabolique et fatale question: Pourquoi ?

    En espérant une réponse de haute volée.

    Cordialement

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    A la compilation ou à l'execution ?
    A l'exécution, c'est toujours à l'exécution un transtypage ! Mais comme il connaît les types, ça se fera tranquillement.
    Citation Envoyé par méphistopheles Voir le message
    Heu, je sait que la question peut paraître impertinente voir déplacée, mais... pourquoi ?En réalité, ce n'est pas une variable mais une opération qui est reinterpret_castée ce qui signifie que la variable en question est une variable qui sera effacée à la ligne suivante.
    Il n'y a pas de cast effectué en réalité. Ca dit de réinterprété le contenu de la case comme un entier non signé, ce qui pose problème une fois sur deux.
    Imagine que c'est un flottant...
    En réalité, les reinterpret_cast, ça marche sur les pointeurs, ça permet de modifier le type sous-jacent.
    Citation Envoyé par méphistopheles Voir le message
    Une fois encore, et en te priant d'excuser l'outrecuidante impétuosité dont je fais preuve dans mes ineptes interrogations, je me permettrais de réitérer, l'insolente, la succincte, l'enfantine et pourtant diabolique et fatale question: Pourquoi ?
    Parce que !
    C'est un cast C-like, dans ce cas ça sera équivalent à un static_cast, mais dans d'autres, ça sera un reinterpret_cast. Donc à éviter.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    C'est un cast C-like, dans ce cas ça sera équivalent à un static_cast, mais dans d'autres, ça sera un reinterpret_cast.
    Ou pire, un const_cast.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par méphistopheles Voir le message
    Une fois encore, et en te priant d'excuser l'outrecuidante impétuosité dont je fais preuve dans mes ineptes interrogations, je me permettrais de réitérer, l'insolente, la succincte, l'enfantine et pourtant diabolique et fatale question: Pourquoi ?

    En espérant une réponse de haute volée.

    Cordialement
    Simplement parce qu'un transtypage prenant la forme de
    est un transtypage issu du C et qu'il subit toutes les limites de son prédécesseur...

    Le C est un langage faiblement typé dans lequel tu *peux* décider à n'importe quel moment de transtyper n'importe quoi en n'importe quoi d'autre, sans que le langage n'aie le moyen de vérifier que la conversion soie possible.

    Cela signifie que, si tu n'y prend pas garde, tu puisse en arriver à faire passer un spagetti pour... une voiture

    Le C++ quant à lui est, en tout cas, plus fortement typé, et fournit une série de possibilités qui nous permettent de nous assurer qu'une conversion est - au minimum - cohérente (que le spagetti ne soit jamais considéré comme autre chose qu'un aliment... avec sans doute même quelques restrictions)

    C'est la raison principale pour laquelle nous conseillons régulièrement de préférer toutes les possibilités offertes par le C++ à l'équivalent qui serait fourni par le C
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Merci beaucoup


    et moi qui croyais que la conversion (untype)unautretype étais propre au C++...

    bon, ben du coup, j'ai quelques lignes à recoder, mais heureusement que le replace existe


    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/03/2009, 13h02
  2. Réponses: 3
    Dernier message: 16/01/2009, 16h28
  3. Réponses: 3
    Dernier message: 06/07/2008, 20h51
  4. quel type de donnée choisir pour simuler le type Currency
    Par maamar1979 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/02/2007, 12h44
  5. Réponses: 5
    Dernier message: 12/10/2006, 13h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo