D'abord, le cahier des charges est qu'il sera de retour d'une valeur de moins de
que, égal ou supérieur à 0, pas nécessairement -1
ou 1
.
Deuxièmement, les valeurs de retour sont rvalues, sous réserve intégrale
promotion, donc il n'y a pas de point dans le retour de quelque chose de plus petit.
EDIT:
Par demande, certains plus d'informations concernant les rvalues et
promotion intégrale.
En C++ (comme en C), chaque expression est une rvalue ou un
lvalue. Historiquement, les termes renvoient au fait que les lvalues
apparaissent sur la gauche d'une affectation, où que rvalues ne peut
apparaissent sur la droite. Aujourd'hui, un simple rapprochement pour
non-types de classe est une lvalue a une adresse en mémoire, un
rvalue ne l'est pas. Ainsi, vous ne pouvez pas prendre l'adresse d'une rvalue,
et cv-qualificatifs (condition "accès") ne s'appliquent pas. Dans
C++ termes, une rvalue qui n'a pas de type de classe est un pur
valeur, pas un objet. La valeur de retour d'une fonction est une
rvalue, sauf si elle a le type de référence. (Non-classe de types de
ajustement dans un registre sera presque toujours être retournés dans un registre,
par exemple, plutôt que dans la mémoire.)
Pour les types de classe, les questions sont un peu plus complexes, en raison de la
fait que vous pouvez appeler des fonctions de membre sur une rvalue. Cette
signifie que rvalues doit en effet disposer d'adresses, pour l' this
pointeur, et peut être de cv qualifiés, depuis le cv-qualification
joue un rôle dans la résolution de surcharge. Enfin, C++11 introduit
plusieurs nouvelles distinctions, à l'appui de références rvalue;
ceux-ci, aussi, sont principalement applicables aux types de classe.
Promotion intégrale se réfère au fait que, lorsque les types intégraux
plus petit qu'un int
sont utilisés comme des rvalues dans une expression, dans
la plupart des contextes, ils seront promus en int
. Donc, même si
J'ai une variable déclarée short a, b;
, dans l'expression a
+ b
, les deux a
et b
sont promues int
avant l'addition
se produit. De même, si j'écris a < 0
, la comparaison est faite
sur la valeur de a
, convertis en int
. Dans la pratique, il n'
très peu de cas où cela fait une différence, au moins sur
2 complète les machines où l'arithmétique des nombres entiers d'enveloppe (c'est à dire
tous, mais très peu d'espèces exotiques, aujourd'hui—je pense que le Unisys
les mainframes sont les seules exceptions à gauche). Encore, même sur le
plus commun des machines:
short a = 1;
std::cout << sizeof( a ) << std::endl;
std::cout << sizeof( a + 0 ) << std::endl;
devrait donner des résultats différents: le premier est l'équivalent de
sizeof( short )
, le deuxième sizeof( int )
(en raison de
promotion intégrale).
Ces deux questions sont formellement orthogonale; rvalues et lvalues
n'ont rien à voir avec la promotion intégrale. Sauf...
partie intégrante de la promotion s'applique uniquement aux rvalues, et la plupart (mais pas
en tout cas où vous utiliseriez une rvalue entraînera
promotion intégrale. Pour cette raison, il n'y a vraiment pas de raison de
pour retourner une valeur numérique dans quelque chose de plus petit que int
.
Il y a même une très bonne raison de ne pas le retourner comme
un type de caractère. Opérateurs surchargés, comme <<
, se comportent souvent
différemment pour les types de caractères, de sorte que vous ne voulez retourner
les personnages comme les types de caractères. (Vous pouvez comparer les
différence:
char f() { return 'a'; }
std::cout << f() << std::endl; // displays "a"
std::cout << f() + 0 << std::endl; // displays "97" on my machine
La différence est que dans le second cas, le plus a
causé promotion intégrale de se produire, ce qui entraîne dans un autre
la surcharge de l' <<
d'être choisi.