1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| std::string foo() {
std::string result("car");
result += "table";
return result;
}
std::string bar() {
return std::string("car");
}
int main()
{
std::string s1 = foo();
// En théorie, il peut y avoir deux appels au constructeur de recopie de std::string :
// -un pour créer le std::string retourné par la fonction à partir de "result" et
// -un pour initialiser s1 à partir du std::string retourné par la fonction.
// En pratique, le compilateur fait du NRVO (Named Return Value Optimization)
// et il n'y a aucun appel au constructeur de recopie de std::string.
const std::string cs1 = foo();
// Idem.
const std::string& crs1 = foo();
// En théorie, il peut y avoir un appel au constructeur de recopie de std::string
// pour créer le std::string retourné par la fonction à partir de "result".
// En pratique, le compilateur fait du NRVO et il n'y a aucun appel au constructeur de recopie de std::string.
// Dans les deux cas, crs1 réfère à un objet temporaire retourné par la fonction.
std::string s2 = bar();
// En théorie, il peut y avoir deux appels au constructeur de recopie de std::string :
// -un pour créer le std::string retourné par la fonction à partir de "std::string("car")" et
// -un pour initialiser s2 à partir du std::string retourné par la fonction.
// En pratique, le compilateur fait du RVO (Return Value Optimization)
// et il n'y a aucun appel au constructeur de recopie de std::string.
const std::string cs2 = bar();
// Idem.
const std::string& crs2 = bar();
// En théorie, il peut y avoir un appel au constructeur de recopie de std::string
// pour créer le std::string retourné par la fonction à partir de "std::string("car")".
// En pratique, le compilateur fait du RVO et il n'y a aucun appel au constructeur de recopie de std::string.
// Dans les deux cas, crs2 réfère à un objet temporaire retourné par la fonction.
return 0;
} |