return {};
signifie que {}
c'est l'initialiseur de la valeur de retour . La valeur de retour est initialisée par liste avec une liste vide.
Voici quelques informations générales sur la valeur de retour , basée sur [stmt.return] dans la norme C ++:
Pour une fonction qui renvoie par valeur (c'est-à-dire que le type de retour n'est pas une référence et non void
), il existe un objet temporaire appelé valeur de retour . Cet objet est créé par l' return
instruction et ses initialiseurs dépendent de ce qui se trouvait dans l'instruction return.
La valeur de retour survit jusqu'à la fin de l'expression complète dans le code qui a appelé la fonction; s'il a un type de classe, alors son destructeur s'exécutera à moins qu'il n'ait prolongé sa durée de vie par l'appelant qui lui lie directement une référence.
La valeur de retour peut être initialisée de deux manières différentes:
return some_expression;
- la valeur de retour est initialisée par copie à partir desome_expression
return { possibly_empty_list };
- la valeur de retour est
initialisée par liste à partir de la liste.
En supposant qu'il T
s'agit du type de retour de la fonction, notez qu'il return T{};
est différent de return {}
: dans le premier, un temporaire T{}
est créé, puis la valeur de retour est initialisée par copie à partir de ce temporaire.
La compilation échouera si T
n'a pas de constructeur de copie / déplacement accessible, mais return {};
réussira même si ces constructeurs ne sont pas présents. En conséquence, return T{};
peut montrer des effets secondaires du constructeur de copie, etc., bien qu'il s'agisse d'un contexte d'élision de copie, donc il ne peut pas.
Voici un bref récapitulatif de l' initialisation de liste en C ++ 14 (N4140 [dcl.init.list] / 3), où l'initialiseur est une liste vide:
- Si
T
est un agrégat, alors chaque membre est initialisé à partir de son initialiseur d' accolade ou d'égalité s'il en avait un, sinon comme par {}
(appliquez donc ces étapes de manière récursive).
- Si
T
est un type de classe avec un constructeur par défaut fourni par l'utilisateur, ce constructeur est appelé.
- Si
T
est un type de classe avec un constructeur implicitement défini ou = default
ed par défaut, l'objet est initialisé à zéro , puis le constructeur par défaut est appelé.
- Si
T
est a std::initializer_list
, la valeur de retour est une telle liste vide.
- Sinon (c'est-à
T
- dire est un type non-classe - les types de retour ne peuvent pas être des tableaux), la valeur de retour est initialisée à zéro.