web-dev-qa-db-fra.com

Que faire si j'écris une déclaration de retour dans le constructeur?

Que faire si j'écris une déclaration de retour dans le constructeur? Est-il conforme aux normes?

struct A
{ 
     A() { return; } 
};

Le code ci-dessus se compile correctement, sans aucune erreur à ideone . Mais le code suivant ne fonctionne pas:

struct A
{ 
   A() { return 100; } 
};

Il donne cette erreur à ideone :

erreur: renvoi d'une valeur à partir d'un constructeur

Je comprends que le retour de la valeur du constructeur n'a aucun sens, car il ne mentionne pas explicitement le type de retour, et nous ne pouvons pas stocker la valeur retournée après tout. Mais je suis curieux de savoir:

  • Quelle déclaration de la norme C++ autorise le premier exemple mais interdit le second? Existe-t-il une instruction explicite ?
  • Le type de retour est-il dans le premier exemple void?
  • Existe-t-il un type de retour implicite ?
44
Nawaz

Oui, l'utilisation des instructions de retour dans les constructeurs est parfaitement standard.

Les constructeurs sont des fonctions qui ne renvoient pas de valeur . La famille de fonctions qui ne renvoie pas de valeur se compose de: fonctions void, constructeurs et destructeurs. Il est indiqué en 6.6.3/2 dans la norme C++. Le même 6.6.3/2 déclare qu'il est illégal d'utiliser return avec un argument dans une fonction qui ne renvoie pas de valeur.

6.6.3 La déclaration de retour

2 Une instruction return sans expression ne peut être utilisée que dans les fonctions qui ne renvoient pas de valeur, c'est-à-dire une fonction avec le type de retour void, un constructeur (12.1) ou un destructeur (12.4) . Une instruction return avec une expression de type non-void ne peut être utilisée que dans les fonctions renvoyant une valeur; la valeur de l'expression est renvoyée à l'appelant de la fonction.

En outre, 12.1/12 indique que

12.1 Constructeurs

12 Aucun type de retour (même pas void) ne doit être spécifié pour un constructeur. Une déclaration de retour dans le corps d'un constructeur ne doit pas spécifier de valeur de retour.

Notez, BTW, qu'en C++, il est légal d'utiliser return avec un argument dans une fonction void, tant que l'argument de return a le type void

void foo() {
  return (void) 0; // Legal in C++ (but not in C)
}

Ceci n'est cependant pas autorisé dans les constructeurs, car les constructeurs ne sont pas des fonctions nulles.

Il y a aussi une restriction relativement obscure relative à l'utilisation de return avec les constructeurs: il est illégal d'utiliser return dans la fonction try-block d'un constructeur (avec d'autres fonctions c'est OK)

15.3 Gestion d'une exception

15 Si une instruction de retour apparaît dans un gestionnaire du bloc de fonction-essai d'un constructeur, le programme est mal formé.

74
AnT

Peut-être la notion d'avoir un retour sans type dans les constructeurs est de contrôler la terminaison de la fonction constructeur.

struct A
{ 
// more definitions     
A() 
{ 
if( !goodToGoOn)  
 return;
// the rest of the stuffs go here
} 
};
5
Shamim Hafiz