Le code suivant se construit, se compile et s'exécute (C++, mingw) apparemment sans aucun problème. Cependant, Ai-je la garantie que les objets construits avec des listes d'initialisation à l'intérieur de la liste des paramètres d'une fonction, vivent dans la portée de cette fonction, même si la fonction prend l'argument par référence ?
Sinon, est-il vrai que lorsque l'on crée un objet en utilisant son initialisateur dans la liste des paramètres d'une fonction (qui prend l'argument par référence), cela peut être dangereux car il sera immédiatement détruit : Dans ce cas, la fonction n'a pas une copie, mais une référence à la mémoire qui peut, ou non, être réallouée par un autre processus ?
struct S
{
S() : a(0), b(0) {}
S(int a, int b) : a(a), b(b) {}
int a;
int b;
};
void foo(const S& s)
{
std::cout << "s.a = " << s.a << std::endl;
std::cout << "s.b = " << s.b << std::endl;
}
int main()
{
foo({4,5}); // <-- What is the scope of the struct initialized here?
return 0;
}
14 votes
La portée de l'objet temporaire dure jusqu'à la fin de l'expression complète. Dans votre cas, l'appel de la fonction. Ce qui signifie que le code que vous montrez est correct.
2 votes
Hors sujet : Vous devriez envisager une norme de codage où les noms des paramètres sont différents des noms des membres.
2 votes
Thomas Matthews : Meh, je l'aime comme ça.
2 votes
Remarque : il s'agit exactement de la même situation que celle qui se présente lorsque vous passez un littéral de chaîne de caractères à une fonction qui prend un fichier de type
const std::string&
donc si elle n'a pas il y aurait beaucoup de code cassé.0 votes
@MilesBudnek Eh bien, n'est-ce pas parce que les chaînes de caractères sont stockées en permanence dans la mémoire statique du programme jusqu'au retour de la fonction principale ?
0 votes
@HunkyMinik Le tableau de
char
a une durée de vie statique, mais lesstd::string
aurait dans cette situation la même durée de vie que l'objet temporaireS
dans cette question.