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

Langage C++ Discussion :

Conversions de type constants


Sujet :

Langage C++

  1. #1
    Rédacteur

    Homme Profil pro
    Développeur PHP & Zend Framework 1 et 2
    Inscrit en
    Avril 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur PHP & Zend Framework 1 et 2
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 259
    Points : 262
    Points
    262
    Par défaut Conversions de type constants
    Bonjour,

    J'ai lu dans un livre que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const float pi = 3.1415;
    (float &) pi = 4;
    est possible en C++.

    Le livre n'expliquant pas pourquoi, j'aimerais comprendre.
    Comment si la variable est déclarer constante peut on la modifier avec un cast par référence.

    Pourquoi const_cast<float> pi = 4 ne fonctionne pas ?

    Quelqu'un peut il m'éclairer ?

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    le code est possible, mais n'aura normalement aucun effet...

    En effet, si tu demande l'affichage de pi après cette opération, tu devrais encore obtenir 3.1415

    La raison pour laquelle le code est accepté est simple: tu utilise un transtypage "C style" qui te permet strictement tout et n'importe quoi (il n'y a aucune vérification effectuée)...

    Cela te permettrait même de transtyper un F16 en bouquet de fleur, si tel était ton désir

    La raison pour laquelle le const_cast n'est pas accepté tel que tu le présente vient de deux erreurs de syntaxe.

    En effet, ce n'est pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const_cast<float> pi = 4;
    ni même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const_cast<float>(pi) = 4;
    qu'il faut écrire (même si la deuxième syntaxe est déjà plus proche de la solution), mais bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const_cast<float &>(pi) = 4;
    parce que const_cast demande que tu indique que le résultat soit une référence ou un pointeur.

    Cependant, le fait que la syntaxe soit acceptée ne veut absolument pas dire que l'instruction aura le moindre effet...

    En effet, l'affichage de pi après cette instruction devrait aussi être... 3.1415...

    (du moins c'est le cas chez moi)

    La raison de cet état de fait est, en définitive, relativement simple:

    Les variables constantes prennent place dans un segment de mémoire qui est "read only" (une fois que la valeur est déterminée, il est impossible de la modifier, et la seule utilisation possible de la valeur est... d'obtenir la valeur).

    Les deux exemples (cast C style et const_cast) dont il est question ici sont deux contre exemples qui consistent à "mentir" au compilateur pour lui faire croire qu'une valeur n'est pas constante et qui peuvent avoir des conséquences catastrophiques, ne serait-ce parce que, si tu ne vérifie pas correctement la valeur après l'instruction, tu risque de partir du fait que pi vaut...4, alors que ce n'est absolument pas vrai

    Ceci dit, et de manière générale, il s'agit de se méfier énormément de toute tentative de suppression de la constante d'un objet.

    En effet, tu auras le plus souvent eu de bonnes raisons pour décider qu'un objet (ou que la référence vers cet objet) devait être constant(e)...

    La raison principale étant sans doute que... tu souhaite restreindre les actions envisageables sur cet objet, pour t'assurer qu'il ne sera pas modifié.

    Le fait de supprimer cette restriction signifie finalement deux choses:
    • Soit que tu n'avais aucun besoin d'assurer la constance de l'objet
    • Soit que tu veux faire quelque chose qui posera problème en essayant malgré tout de modifier un objet qui n'a pas lieu de l'être
    Par contre, l'inverse (décider de transtyper un objet non constant en un objet constant) posera beaucoup moins de problème, parce que tu ne fait que rajouter des restrictions à son utilisation
    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

  3. #3
    Rédacteur

    Homme Profil pro
    Développeur PHP & Zend Framework 1 et 2
    Inscrit en
    Avril 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur PHP & Zend Framework 1 et 2
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 259
    Points : 262
    Points
    262
    Par défaut
    Merci beaucoup pour cette réponse, ça commence a être déjà plus clair.

    Si je suis ton raisonnement (si j'ai bien compris ), le code ci contre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const int a = 5;
    int & b = const_cast<int &> (a);
    b++;
    ne devrait pas modifié la valeur de a ?
    Pourtant l'affichage de a vaut 6 nan ?

    Sinon, la seule raison pour conts_cast d'exister et de pour pouvoir passer à une fonction qui demande un paramètre non constant une constante c'est ça ?

  4. #4
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Citation Envoyé par Koala01
    En effet, l'affichage de pi après cette instruction devrait aussi être... 3.1415...
    Koala, avec VS2005, ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    const float pi1 = 3.1415f;
    const float pi2 = 3.1415f;
    const float pi3  = 3.1415f;
     
    (float)pi1 = 4;
    (float&)pi2 = 4;
    const_cast<float&>(pi3) = 4;
     
    std::cout << pi1 << std::endl;
    std::cout << pi2 << std::endl;
    std::cout << pi3 << std::endl;
    affiche '4' dans tous les cas.
    Il semblerait qu'on ait affaire à un comportement indéfini.

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur PHP & Zend Framework 1 et 2
    Inscrit en
    Avril 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur PHP & Zend Framework 1 et 2
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 259
    Points : 262
    Points
    262
    Par défaut
    Cela dépend alors si le compilateur place les constantes dans un "read only".

    La norme dit quelque chose à ce sujet ou elle le choix au compilateur de placer les const dans un "read only" ?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Arzar Voir le message
    Koala, avec VS2005, ce code :
    Avec gcc 4.4.1, sans activer le support de la nouvelle norme:
    refusé à la compilation (lvalue required as left operand of assignment )
    Y compris avec le support C++0x activé (j'aurais pensé que le lvalue references auraient pu changer quelque chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    (float&)pi2 = 4;
    const_cast<float&>(pi3) = 4;
     
    std::cout << pi1 << std::endl;
    std::cout << pi2 << std::endl;
    std::cout << pi3 << std::endl;
    affiche '3.1415' dans tous les cas.
    Il semblerait qu'on ait affaire à un comportement indéfini.
    Il semblerait en effet

    @fnnyaert >>Attention, on parle de deux choses tout à fait différentes...
    d'un coté, on crée une référence non nommée et non constante vers une variable constante, alors que de l'autre, tu crée une référence nommée mais non constante vers une variable constante

    Et là, nous en arrivons au comportement que je qualifiais de dangereux qui consiste à supprimer la constance d'un objet...

    Si le but est de modifier un objet constant, pourquoi diable avoir décrété qu'il ne devait pas être modifié

    Quant à savoir ce que dit la norme sur le sujet des références non nommées vers des objets constant, et sans avoir vérifié, je dirais sans doute que c'est un comportement indéfini, et donc particulièrement dangereux
    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
    Rédacteur

    Homme Profil pro
    Développeur PHP & Zend Framework 1 et 2
    Inscrit en
    Avril 2007
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur PHP & Zend Framework 1 et 2
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 259
    Points : 262
    Points
    262
    Par défaut
    Très bien merci j'ai compris !

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Parmi les facteurs contribuants à tel ou tel comportement, j'en vois deux:
    1. Si la constante est inlinée ou non:
      • Si elle est inlinée, les tentatives d'écriture, qu'elles agissent ou non sur la mémoire, ont des chances de laisser l'affichage inchangé parce que la valeur ne sera pas vraiment "lue".
      • Si elle n'est pas inlinée et qu'elle existe réellement en mémoire, une tentative d'écriture peut mener à une violation d'accès.
    2. où est déclarée la constante:
      • Variable globale: possibilité de déclaration en mémoire à lecture seule, risque de violation d'accès.
      • Variable locale: peut être déclarée simplement sur la pile.
    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.

  9. #9
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Euh :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (int)var = somexp;
    ça compilera pas.. Y'a pas de lvalue à gauche. (un cast renvoie une r-value)

    edit : je faisais référence au message de arzar... mais en fait c'est plutôt une erreur de clavier qu'autre chose non?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  10. #10
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Ben si, c'est bien (float)pi1 = 4;
    Je rate rarement mes copiers-collés.

    Et ça compile avec VS2005 et affiche 4. Je suis aussi surpris que toi.

  11. #11
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    C'est pas pour rien qu'il est deprecated alors... . Seulement je vois même pas comment ça peut avoir un sens en fait.

    Mais apparemment les vieilles versions de gcc laissé passez ce genre de chose aussi (jsuis tombé sur une ML où un gars avait l'erreur "iso c++ forbids cast to non-reference type used as lvalue" après une mise à jour). Par contre je sais pas ce que ça donnait.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  12. #12
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Enfin, quoi qu'il en soit, le souhait qui consiste à trouver un moyen d'appliquer une suppression de constante à une valeur déclarée constante doit, quoi qu'il arrive, nous inciter à nous poser la question de l'opportunité d'avoir déclaré cette valeur constante et / ou de celle te vouloir la modifier...
    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

  13. #13
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Ce sujet m'intrigue...

    Parce que, imaginons ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int a = 1;
    const int* b = &a;
    int& c = const_cast< int & >( *b );
    c = 2; // comportement défini, a == 2
    assert( a == 2 );
    A mon avis, le comportement ici devrait être que a == 1. Car, c ne devrait pas pouvoir modifier a, du moins pas à partir de b.

    Je sais que l'utilisation de const_cast est "souvent" signe d'une mauvaise conception, mais quelqu'un pourrait me montrer un cas où son utilisation est judicieux ?

    (Sachant que l'inverse, non-const -> const, est implicite et là, je peux y voir un intérêt).

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    J'ai tendance à utiliser const_cast quand j'ai une classe de conteneurs avec un accesseur nécessitant des calculs ou une recherche, un truc du genre:

    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Contenu const & Conteneur::GetContenu(params) const
    {
    	//(recherche du bon contenu)
    	return ret;
    }
     
    Contenu & Conteneur::GetContenu(params)
    {
    	Conteneur const * thisC = this;
    	Contenu const & retC = thisC->GetContenu(params);
    	return const_cast< Contenu & >(retC);
    }
    Dans le cas ci-dessus, je considère le const_cast "moins grave" que la duplication de code.
    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.

  15. #15
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    Je sais que l'utilisation de const_cast est "souvent" signe d'une mauvaise conception, mais quelqu'un pourrait me montrer un cas où son utilisation est judicieux ?
    Je vois essentiellement deux cas où l'usage d'un const_cast est nécessaire:
    • Lorsqu'un objet constant doit être passer à une fonction d'une bibliothèque externe qui ne modifiera pas cette objet mais qui ne le qualifie pas de constant dans son prototype (donc pour contourner une incohérence dans le prototype d'une fonction).
    • Pour contourner l'absence de "mutable" sans "déconstifier" certaines méthodes sur des compilateurs anciens.

  16. #16
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    J'ai tendance à utiliser const_cast quand j'ai une classe de conteneurs avec un accesseur nécessitant des calculs ou une recherche
    Pourquoi ta 2ème méthode ne devrait pas être const ?
    Pourquoi ne pas le faire en 3 méthodes claire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Contenu const & Conteneur::GetContenu(params) const
    {
          return _GetContenu( params );
    }
     
    Contenu & Conteneur::GetContenu(params) const
    {
          return _GetContenu( params );
    }
     
    Contenu & Conteneur::_GetContenu( params ) const
    {
          // recherche
          return ret;
    }
    De plus, si tu permets l'accès en écriture, quelle est l'utilité d'avoir une méthode qui renvoi un objet const ? Sachant qu'un objet non-const est aussi une rvalue.

    Si c'est pour l'usage privé de la classe, ou en héritage, _GetContenu n'est-il pas suffisant ?

    Citation Envoyé par gl Voir le message
    Je vois essentiellement deux cas où l'usage d'un const_cast est nécessaire:
    • Lorsqu'un objet constant doit être passer à une fonction d'une bibliothèque externe qui ne modifiera pas cette objet mais qui ne le qualifie pas de constant dans son prototype (donc pour contourner une incohérence dans le prototype d'une fonction).
    • Pour contourner l'absence de "mutable" sans "déconstifier" certaines méthodes sur des compilateurs anciens.
    Pour le 1er point, je ne qualifie pas ça d'une utilisation judicieuse, je qualifie ça de manque de rigueur de la part de la personne qui a développé la bibliothèque et donc d'un "bypass". C'est moche.

    Pareil pour le 2ème argument... Si on a pas le choix du tout du compilateur, même passer à une version supérieur, à la limite...

    Ce que je voulais dire, c'est... Quel est réellement le rôle de const_cast, si ce n'est pour contourner des problèmes... N'a-t-il pas un but précis, une situation où on ne peut pas faire sans dans la norme actuelle ?

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Pourquoi ne pas le faire en 3 méthodes claire ?
    Parce que la troisième méthode n'est pas toujours possible (par exemple, si l'on utilise un conteneur propageant la constance en tant que membre de la classe)
    De plus, si tu permets l'accès en écriture, quelle est l'utilité d'avoir une méthode qui renvoi un objet const ?
    La méthode qui renvoie un objet const est const. Celle qui renvoie un objet non-const est non-const. C'est un conteneur qui propage la constance.
    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.

  18. #18
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Parce que la troisième méthode n'est pas toujours possible (par exemple, si l'on utilise un conteneur propageant la constance en tant que membre de la classe)

    La méthode qui renvoie un objet const est const. Celle qui renvoie un objet non-const est non-const. C'est un conteneur qui propage la constance.
    Je ne comprend pas très bien en quoi le fait que les 3 méthodes soient const empêche la propagation de constance, en fait
    Au contraire, ça devrai l'accentuer, non ?

    Je comprend pas trop l'intérêt d'avoir un Getter non-const...

  19. #19
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    Pour le 1er point, je ne qualifie pas ça d'une utilisation judicieuse, je qualifie ça de manque de rigueur de la part de la personne qui a développé la bibliothèque et donc d'un "bypass". C'est moche.

    Pareil pour le 2ème argument... Si on a pas le choix du tout du compilateur, même passer à une version supérieur, à la limite...
    Oui, ce sont des contournements de problèmes (comme je l'avais d'ailleurs précisé). Toutefois ils ne sont pas ici signe d'une mauvaise conception dans notre code mais d'un souci dans un élément tiers (bibliothèque externe ou compilateur).

    Ce n'est peut être pas "judicieux" comme usage, mais c'est souvent nécessaire (et généralement, beaucoup plus judicieux que d'enlever purement et simplement le qualificatif const dans notre code).

    Citation Envoyé par JulienDuSud Voir le message
    Ce que je voulais dire, c'est... Quel est réellement le rôle de const_cast, si ce n'est pour contourner des problèmes... N'a-t-il pas un but précis, une situation où on ne peut pas faire sans dans la norme actuelle ?
    Mis à part quelque cas rares (comme celui proposé par Médinoc), le rôle de const_cast est essentiellement d'être compatible avec un existant peu rigoureux sur les const ou de contourner des problèmes de const trop restrictif.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par JulienDuSud Voir le message
    Je ne comprend pas très bien en quoi le fait que les 3 méthodes soient const empêche la propagation de constance, en fait
    Au contraire, ça devrai l'accentuer, non ?
    Ben non, puisque ça permet de modifier un contenu alors que le conteneur est const --> La propagation de constance est rompue.

    Je comprend pas trop l'intérêt d'avoir un Getter non-const...
    C'est parce que ce getter retourne une référence non-const. C'est un truc à mi-chemin entre le getter et le setter, puisqu'il permet de modifier le contenu. Donc, il faut qu'il soit non-const.

    Je suis constant que tous les conteneurs ne propagent pas la constance, et je suis également constant qu'on ne veut pas toujours que la constance soit propagée.
    Mais quand on décide de propager la constance, il faut s'y tenir jusqu'au bout.
    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.

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

Discussions similaires

  1. [DATE][CONVERSION] du type numerique au type date
    Par hamed dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 06/04/2005, 16h16
  2. Conversion de type
    Par sovitec dans le forum Langage
    Réponses: 5
    Dernier message: 15/12/2004, 14h29
  3. Conversion de type
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 06/07/2004, 10h30
  4. [MYSQL] conversion de type sur import de script
    Par sebos63 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 27/08/2003, 10h00
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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