Le code suivant construit, compile et s'exécute (C++, mingw) en apparence sans aucun problème. Cependant, suis-je garanti que les objets construits avec des listes d'initialiseurs à l'intérieur de la liste des paramètres d'une fonction, survivent à la portée de cette fonction, même si la fonction prend l'argument par référence?
Sinon, est-il vrai que lors de la création d'un objet à l'aide de sa liste d'initialiseurs dans la liste des paramètres d'une fonction (qui prend l'argument par référence) peut être dangereux car il sera immédiatement détruit: dans ce cas, la fonction n'a pas de 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;
}
Selon cppreference [durée de vie] :
Tous les objets temporaires sont détruits comme dernière étape de l'évaluation de l'expression complète qui contient (lexicalement) le point où ils ont été créés, et si plusieurs objets temporaires ont été créés, ils sont détruits dans l'ordre inverse de l'ordre de création. Cela est vrai même si cette évaluation aboutit à lever une exception.
Cela signifie que l'objet temporaire sera détruit après la fonction est revenue, donc c'est parfaitement sûr.
Ici, la valeur s'est matérialisée pour créer un objet temporaire de type S
à partir de la liste d'initiation contreventée {4,5}
, Qui est détruite à la fin de l'expression complète. Dans votre cas foo({4,5});
.