Peut-être que certains d'autres precisions sur le pourquoi de la partie de la question.
C++ a été conçu de sorte qu'un très grand corps de pré-corps de C code compile avec le minimum de modifications. Malheureusement, C lui-même était en train de payer un droit similaire à la première pré-standard C, qui n'ont même pas de l' void
mot-clé et s'est plutôt appuyée sur une valeur par défaut type de retour d' int
. C fonctions d'habitude les valeurs de retour, et chaque fois que le code superficiellement similaire à Algol/Pascal/procédures de Base a été écrit sans aucune return
états, la fonction a été, sous le capot, le retour selon les ordures laissées sur la pile. Ni l'appelant ni le destinataire de l'appel affecte la valeur de la poubelle d'une façon fiable. Si la poubelle est alors ignoré par tous les appelant, tout est beau et C++ hérite de l'obligation morale de les compiler le code.
(Si la valeur retournée est utilisé par l'appelant, le code peut avoir un comportement non déterministe, comme pour le traitement d'une variable non initialisée. Pourrait la différence être identifiés de manière fiable par un compilateur, dans un hypothétique successeur du langage C? Ce n'est guère possible. L'appelant et l'appelé peut-être dans les différentes unités de compilation.)
L'implicite int
n'est qu'une partie de l'héritage en cause ici. Un "répartiteur" fonction peut, en fonction d'un paramètre, de retour d'une variété de types de certaines branches de code, et de ne renvoyer aucune valeur d'utilité des autres branches de code. Une telle fonction serait généralement être déclarée pour retourner un type assez long pour contenir tous les types possibles et l'appelant peut-être besoin de le jeter ou de l'extraire à partir d'un union
.
Donc, la cause la plus profonde est probablement le langage C créateurs croyance que les procédures qui ne retourne pas de valeur sont juste un peu d'importance du cas particulier de fonctions; ce problème a aggravées par le manque de focalisation sur la sécurité du type d'appels de fonction dans le plus vieux C dialectes.
Tandis que le C++ n'a casser la compatibilité avec certains des pires aspects de C (exemple), la volonté de compiler une instruction de retour sans valeur (ou la valeur implicite retour à la fin de la fonction) n'était pas l'un d'eux.