Question :
Selon la norme C, lorsqu'une fonction renvoie une liste d'initialisation, la durée de vie de son tableau sous-jacent doit-elle s'étendre jusqu'à la fonction appelante ?
La norme C stipule que la durée de vie d'un objet std::initializer_list est la même que celle de l'objet qu'il initialise. Lorsqu'une fonction renvoie une liste d'initialisation, elle initialise l'objet de valeur de retour. Cependant, deux instances de la liste d'initialisation sont impliquées : celle dans la fonction et celle dans le code appelant.
L'exemple de la norme suggère que la durée de vie du tableau s'étend à l'objet copié, ce qui impliquerait que le tableau de la valeur de retour devrait également survivre dans la fonction appelante. Cependant, ce n'est pas le cas en pratique.
Réponse :
Actuellement, le comportement de la durée de vie d'une valeur de retour std::initializer_list n'est pas clairement défini dans la norme C. Différents compilateurs l'implémentent différemment :
En conclusion, il n'est actuellement pas possible de se fier à la durée de vie d'un std :: valeur de retour initializer_list s'étendant dans la fonction appelante. Évitez d'utiliser std::initializer_list pour transmettre des valeurs, car cela peut entraîner un comportement inattendu.
Remarques supplémentaires :
DR 1290 a modifié le libellé de la norme et Les DR 1565 et 1599, qui sont toujours ouverts, abordent des questions connexes. Cependant, la sémantique est encore en cours de définition et il faudra du temps aux compilateurs pour mettre en œuvre les modifications finales.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!