Partage
  • Partager sur Facebook
  • Partager sur Twitter

Stocker une valeur de retour temporairement

    20 août 2022 à 23:16:41

    Bonjour, j'aimerais récupérer le résultat d'une fonction qui renvoie un unique_ptr et j'aimerais le move directement dans un vector, du coup il faut que je mette auto, auto& ou auto&& ?

    unique_ptr<T> getT();
    
    int main(){
        vector<T> vec;
            
        auto t = getT(); // il faut mettre auto&& ?
        //... d'autre code
        vec.push_back(std::move(t)); // je veux mettre le T dans un vector
    }



    -
    Edité par MahometUrsufa 20 août 2022 à 23:16:55

    • Partager sur Facebook
    • Partager sur Twitter
      21 août 2022 à 9:27:08

      Bonjour,

      auto t : marche très bien, tu récupères le temporaire retourné par getT().
      auto& t : ne va pas, tu ne peux pas référencer un temporaire.
      auto&& t : est très particulier, ça permet de s'auto-adapter à ce que getT() pourrait retourner, et donc ici va faire comme pour auto t.
      il y a aussi auto const t : pas d'erreur ligne 6 mais la ligne 8 est alors impossible.
      il y a aussi auto const& t : même conséquence, correspond aussi ici à t capte le pointeur et ne le donnera plus jusqu'à sa mort!

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        22 août 2022 à 0:21:44

        D'accord merci, mais est ce qu'il y aura une copie si je met auto ? J'ai pas confiance si c'était moi j'aurais envie de mettre auto&& dans le doute, car tout ce que je veux faire c'est récupérer la valeur et la passer au vecteur. Le mieux aurait été de faire 

        vec.push_back(getT());

        comme ça on est sûr que c'est bon, mais malheuresement il y a du code entre le make_Unique et le push back

        • Partager sur Facebook
        • Partager sur Twitter
          22 août 2022 à 3:11:11

          auto et auto&& doivent mémoriser le smart pointer. Il sera normalement créé en place dans t, par getT() évitant une copie; les 2 reviennent au même. Puis t transmet son pointeur à vec et sera détruit à la fin du block. En faisant directement vec.push_back(getT()), le temporaire est détruit dès la fin de l'expression au lieu d'à la fin du block. On ne peut pas faire mieux, il faut bien mettre quelque part le résultat de getT() en attendant qu'il soit utilisé.
          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            23 août 2022 à 11:33:46

            MahometUrsufa a écrit:

            D'accord merci, mais est ce qu'il y aura une copie si je met auto ?


            Je ne pense pas, il y aura très certainement de la copy elision.

            De plus dans ton code, tu as un vector<T> et tu fais un push_back du résultat du std::move (donnant un unique_ptr<T>). Mais je pense que tu t'en rendras compte (si ce n'est pas déjà fait ) à la compilation ;)

            -
            Edité par Didy7 23 août 2022 à 12:08:54

            • Partager sur Facebook
            • Partager sur Twitter

            Stocker une valeur de retour temporairement

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown