À partir du code ci-dessous, Si RVO est arrivé, je me attendre à voir les 2 adresses pointant vers le même endroit, mais ce n'est pas le cas (mon compilateur est MS VC9.0)Quand RVO devrait-il intervenir?
#include <iostream>
#include <string>
std::string foo(std::string& s)
{
std::cout << "address: " << (unsigned int)(&s) << std::endl;
return s;
}
int main()
{
std::string base = "abc";
const std::string& s = foo(base);
std::cout << "address: " << (unsigned int)(&s) << std::endl;
std::cout << s << std::endl;
return 0;
}
Dans quelles conditions L'OVR devrait-il se produire?
BTW, je fonde ma question sur la discussion suivante: http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/
Je la question OP, il obtient une référence de ce qui est retourné par la fonction.Normalement tout le monde devrait dire "horreur, ça va planter!" mais dans ce cas le fait qu'il l'a déclaré const prolonge la durée de vie du temporaire jusqu'à la fin de la portée, lui sauvant le crash attendu. Mais dans tous les cas, il n'utilise pas de retour VALUE de toute façon à cause de cette référence. – Lightness1024