Est-ce que renvoyer un code valide est invalide?

J’ai découvert que le code suivant est accepté par les compilateurs Visual C ++ 2008 et GCC 4.3:

void foo() { } void bar() { return foo(); } 

Je suis un peu surpris que cela comstack. Est-ce une fonctionnalité de langue ou s’agit-il d’un bogue dans les compilateurs? Que disent les normes C / C ++ à ce sujet?

C’est une fonctionnalité de langage de C ++

C ++ (ISO 14882: 2003) 6.6.3 / 3

Une instruction de retour avec une expression de type “cv void” ne peut être utilisée que dans des fonctions avec un type de retour de cv void; l’expression est évaluée juste avant que la fonction ne retourne à son appelant.

C (ISO 9899: 1999) 6.8.6.4/1

Une instruction de retour avec une expression ne doit pas apparaître dans une fonction dont le type de retour est vide.

Oui, c’est un code valide. Cela est nécessaire lorsque vous avez des fonctions de modèle pour pouvoir utiliser un code uniforme. Par exemple,

 template T f(int x, P y) { return g(x, y); } 

Maintenant, g peut être surchargé pour renvoyer vide lorsque le second argument est un type particulier. Si “retour nul” était invalide, l’appel à f serait alors rompu.

Ceci est valide et peut être très utile, par exemple, pour créer un code plus propre dans les situations où vous souhaitez gérer les erreurs avant de retourner:

 void ErrRet(int code, char* msg) { // code logging/handling error } void f() { if (...) return ErrRet(5, "Error Message !"); // code continue } 

Valide en effet. Je l’utilise souvent pour les macros de validation des entrées:

 #define ASSERT_AND_RETURN_IF_NULL(p,r) if (!p) { assert(p && "#p must not be null"); return r; } bool func1(void* p) { ASSERT_AND_RETURN_IF_NULL(p, false); ... } void func2(void* p) { ASSERT_AND_RETURN_IF_NULL(p, void()); ... }