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:
void
?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é.
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
}
};