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
}
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 pourauto 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 à tcapte le pointeur et ne le donnera plus jusqu'à sa mort!
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
autoet 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 ttransmet son pointeur à vecet 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é.
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
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.
En recherche d'emploi.
En recherche d'emploi.