none
Initialiser une référence avec une variable temporaire n'émet pas de warning RRS feed

  • Question

  • Pourquoi le code suivant n'émet pas de warning ?

    class A
    {
    public:
    int a_;
    public:
    A(int a=0) : a_(a) {;}
    };

    A fct1()
    {
    return A(12);
    }

    int main (int argc, char* argv[])
    {
    A& a = fct1();
    printf( "%u\n", a.a_ );

    getchar();

    return 0;
    }

    Dans le main(), j'initialise la référence A& avec un objet qui est temporaire. Ne devrais-je pas avoir un warning du genre "référence à un objet qui va être out of scope" ?

    J'ai fait le test sous Visual 2010.

    jeudi 1 mars 2012 10:51

Réponses

  • Dans cet exemple, fct1() retourne un objet par valeur. C'est à dire qu'une copie de l'objet A est effectuée lors du retour de la fonction fct1(). Et c'est cette copie qui est utilisée hors de fct1(). Cette copie temporaire retournée n'est pas créé dans le contexte de la fonction fct1.

    Ensuite, c'est une référence à l'objet copié qui est affecté.

    Par contre, si fct1 était déclaré de la manière suivante :

    A &fct1()
    {
    return A(12);
    }

    Alors il y aurait un problème, car la fonction ne retournerait pas une copie de l'objet créé dans la fonction, mais une référence de l'objet créé dans la fonction. Et effectivement, la référence ne pourrait pas être utilisée hors de la fonction. C'est d'ailleurs ce que signale le compilateur avec un message :

    consoleapplication3.cpp(17): warning C4172: returning address of local variable or temporary


    jeudi 1 mars 2012 14:29
    Auteur de réponse

Toutes les réponses

  • Dans cet exemple, fct1() retourne un objet par valeur. C'est à dire qu'une copie de l'objet A est effectuée lors du retour de la fonction fct1(). Et c'est cette copie qui est utilisée hors de fct1(). Cette copie temporaire retournée n'est pas créé dans le contexte de la fonction fct1.

    Ensuite, c'est une référence à l'objet copié qui est affecté.

    Par contre, si fct1 était déclaré de la manière suivante :

    A &fct1()
    {
    return A(12);
    }

    Alors il y aurait un problème, car la fonction ne retournerait pas une copie de l'objet créé dans la fonction, mais une référence de l'objet créé dans la fonction. Et effectivement, la référence ne pourrait pas être utilisée hors de la fonction. C'est d'ailleurs ce que signale le compilateur avec un message :

    consoleapplication3.cpp(17): warning C4172: returning address of local variable or temporary


    jeudi 1 mars 2012 14:29
    Auteur de réponse
  • Merci pour la réponse claire!
    jeudi 1 mars 2012 14:36