Qu'est-ce que la déclaration
return {};
en C ++ 11 indiquer, et quand l'utiliser au lieu de (disons)
return NULL;
ou
return nullptr;
Qu'est-ce que la déclaration
return {};
en C ++ 11 indiquer, et quand l'utiliser au lieu de (disons)
return NULL;
ou
return nullptr;
return;
sans valeur?return;
D'autre part,return{};
c'est valide si vous avez un type de retour.Réponses:
return {};
indique "retourner un objet du type de retour de la fonction initialisé avec un initialiseur de liste vide ". Le comportement exact dépend du type de l'objet retourné.De cppreference.com (parce que l'OP est étiqueté C ++ 11, j'ai exclu les règles en C ++ 14 et C ++ 17; reportez-vous au lien pour plus de détails):
Avant C ++ 11, pour une fonction retournant a
std::string
, vous auriez écrit:En utilisant la syntaxe d'accolade en C ++ 11, vous n'avez pas besoin de répéter le type:
return NULL
etreturn nullptr
doit être utilisé lorsque la fonction renvoie un type de pointeur:Cependant,
NULL
est déconseillé depuis C ++ 11 car il s'agit simplement d'un alias vers une valeur entière (0), alors qu'ilnullptr
s'agit d'un type de pointeur réel:la source
C'est probablement déroutant:
Ce n'est probablement pas:
la source
initializer_list
constructeur, ne serait-il pas utilisé si aucun constructeur par défaut n'est disponible?return {}
n'est PAS équivalent àreturn SomeObjectWithADefaultConstructor{};
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'ilreturn T{};
est différent dereturn {}
: dans le premier, un temporaireT{}
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, maisreturn {};
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:
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).T
est un type de classe avec un constructeur par défaut fourni par l'utilisateur, ce constructeur est appelé.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é.T
est astd::initializer_list
, la valeur de retour est une telle liste vide.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.la source
{}
, qui peut ou non être value-init.C'est une sorte de raccourci pour une nouvelle instance du type de retour des méthodes.
la source