Pourquoi peut-on dire que l'élément retourné n'est pas l'objet local w, mais une référence sur w ? En quoi std::move(w) produirait-il une référence sur w ?
Je ne saisis pas.
2) "lorsque différents chemins de contrôle dans une fonction renvoient des variables locales différentes" :
Pouvez-vous me donner un exemple de cette situation car je n'ai pas saisi ce que ça veut dire.
Pourquoi peut-on dire que l'élément retourné n'est pas l'objet local w, mais une référence sur w ? En quoi std::move(w) produirait-il une référence sur w ?
C'est quoi la signature de std::move ? Quel type cette fonction retourne-t-elle ?
Donc elle change la Lvalue "w" en Rvalue, ce qui a pour effet d'appeler le constructeur par déplacement, au lieu de celui par copy
Sauf qu'ici, en obligeant l'appel de move, tu empêche l'optimisation NRVO qui permet d'éliminer tout objets temporaires.
Si tu ajoute des conditions, le compilateur pourrait ne pas optimiser par élision et il utiliser implicitement "std::move" à la place
T Bob(bool k)
{
T a, b;
return k ? a : b; // lvalue expression, copied
return std::move(k ? a : b); // moved
if (k)
return a; // moved, and possibly elided
else
return b; // moved, and possibly elided
}
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
C'est cool de donner les réponses. Mais ca permet juste de donner les réponses, pas de savoir si les gens ont compris les réponses. C'est quand meme mieux de les amener a trouver la reponse par eux meme.
Oui je comprend ton point de vue, mais j'ai l'impression que la question serait rester en suspend indéfiniment, ce qui n'est guère mieux. Aussi pour tout les autres qui sont intéresser à la question, je préfère donner un réponse complète.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
Sans critiquer ton approche, pour ma part je considère que ce n'est pas un chat non plus, je ne vais pas stackoverflow pour avoir des réponses indirectes.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
il y un déplacement (pas une copie) car k est en paramètre de ta fonction. C'est un cas particulier dans le traitement de la NRVO
Bon point! L'optimisation "RVO", ne peut avoir lieu si le compilateur ne peut connaître l'instance retourné (qui est connue seulement au runtime à cause de k)
Ce n'est pas une exception, c'est le type de retour de la ternaire qui détermine s'il y a RVO ou non. Une ternaire qui prend 2 lvalues retourne une lvalue: pas de RVO sur les lvalues. Que k soit une constante de compilation ou non ne change pas le résultat.
× 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.
GitHub
Discord NaN. Mon site.
Discord NaN. Mon site.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
Discord NaN. Mon site.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
Discord NaN. Mon site.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.
GZE, un moteur multiplateforme, adapté pour de la 2D, 3D et création de logiciels.