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 :

Référence vers littéral


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Référence vers littéral
    Hello,

    Je viens de découvrir qu'on pouvait faire :

    Quel intérêt ?

    Le seul que je vois, c'est l'utilisation des références dans les appels de fonction, pour éviter de copier un argument qu'on donne sous forme d'objet temporaire. Dans ce cas là, l'intérêt de la chose serait lié aux temporaires, plutôt qu'aux littéraux...

  2. #2
    Membre Expert Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Par défaut
    Bonjour

    Lorsque tu as une fonction qui prend une référence sur membre constant, tu peux passer un objet ou un temporaire directement.

    Personnellement, je m'en sers pour "renommer" des variables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::map<key_t, value_t> map;
    for (auto const & key_value : map)
    {
        key_t const & key = key_value.first;
        value_t const & value = key_value.second;
    }

  3. #3
    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,

    En fait, ce n'est ni plus ni moins qu'un "effet de bord" des restrictions imposées aux références : une référence, qu'elle soit constante ou non, doit être initialisée au moment de sa déclaration, point barre.

    Du moment où l'initialisation de la référence est correcte, le compilateur s'en fout royalement de savoir si cela a du sens ou non! Il n'est pas payé pour cela et il n'a aucun moyen de le décider.

    Il agit donc en "brave petit soldat" qui ne demande même pas "à quelle hauteur" quand on lui demande de sauter, et qui saute aussi haut et aussi loin que possible .

    Alors, est-ce que ca a du sens Pas vraiment.

    Mais c'est toi qui prend les décisions de conception et si tu prends une décision absurde, mais syntaxiquement correcte, le compilateur ne pourra que te répondre "oui chef, bien chef" parce que c'est tout ce qu'on lui a apris à faire
    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

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    MA question ne se situait pas vraiment à propos du compilateur.

    Mais j'ai lu ça dans C++ Primer, et ça m'avait intrigué.

  5. #5
    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
    Citation Envoyé par oodini Voir le message
    MA question ne se situait pas vraiment à propos du compilateur.
    Je me doutes bien, mais comme c'est lui qui dira si le code est valide ou non, tout passe par lui et, comme il ne fait qu'appliquer les règles "simples" qu'on lui a indiqué, bah... il n'a pas trop le choix.

    Mais, sinon, il faut savoir que déclarer une référence constante n'est pas anormal en soi :

    Si tu dois travailler avec un objet renvoyé par l'accesseur d'un objet constant (le patron de conception dit "du null object" permet de renvoyer systématiquement une référence, y compris sur un objet invalide, par exemple), le code est très certainement plus lisible si tu écris un code proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    const MonType & recup=obj.getXXX();
    recup.truc();
    recup.brol();
    recup.bidule();
    que si tu dois commencer à passer systématiquement par l'accesseur de l'objet, sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    obj.getXXX().truc();
    obj.getXXX().brol();
    obj.getXXX().bidule();
    (sans compter que tu y gagne une indirection )

    Dans de telles conditions, il est même tout à fait normal, logique et légal de récupérer une référence constante

    Mais, à partir du moment où il est légal de le faire avec un objet ayant sémantique d'entité, il est légal de le faire avec strictement n'importe quoi

    Et c'est là qu'apparait l'effet de bord : quand tu utilises un littéral, la valeur de celui-ci est placée en mémoire et prend la place de n'importe quelle valeur de type similaire, donc, tu peux en récupérer l'adresse ou définir une référence constante dessus.

    Alors, comme je te le disais, pour un type primitif, cela n'a pas vraiment beaucoup de sens, de le faire.

    Mais, comme ce n'est pas illégal (et, qu'en plus, cela un comportement cohérent du fait qu'on parle d'une référence constante), il n'y a rien qui t'interdise de le faire!

    Mais les développeurs font tellement de choses qui n'ont pas forcément beaucoup de sens! Ce n'est qu'une chose en plus finalement
    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

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    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
    17
    18
    19
     
    int f(int const& i)
    {
      return i+1;
    }
     
    int g(int& i)
    {
      return i+1;
    }
     
    int main()
    {
       int a = 23;
       f(a); // OK
       f(42); // OK
       g(a); // OK
       g(42); // NOK
    }
    De la même manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int&a = 42; // NOK
    int const&b = 42; // OK
    C’est une question de cohérence. Pouvoir passer une constante littérale (ou éventuellement un temporaire) à une fonction qui prend une référence constante est quand même bien pratique.

    Et n’oublie pas que la durée de vie d’un objet sur lequel existe une référence constante… se prolonge jusqu’à la fin de cette référence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::string const& s = "toto"; // OK
    std::string & s2 = "toto"; // NOK

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/04/2008, 16h07
  2. [JSTL] références vers le site de sun
    Par nikalkal dans le forum Taglibs
    Réponses: 7
    Dernier message: 17/12/2007, 15h38
  3. Garder une référence vers une variable d'une autre classe
    Par choupeo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 08/12/2007, 18h30
  4. Utilisations croisés de références vers des dll
    Par Pilloutou dans le forum Framework .NET
    Réponses: 3
    Dernier message: 05/11/2006, 21h56
  5. Comment stocker une référence vers un TTreeNode ds un DFM ?
    Par phplive dans le forum Composants VCL
    Réponses: 1
    Dernier message: 19/07/2005, 12h33

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