Comment le C++ gère-t-il la surcharge des fonctions dans ce cas ?
#include <iostream>
void func(int x)
{
std::cout << "integer";
}
void func(short x)
{
std::cout << "short";
}
int main(void)
{
func(3);
}
Sortie : entier
Pourquoi ça ?
50 votes
Parce que
3
est un nombre entier.3 votes
Duplicata possible de Comment écrire un littéral court en C++ ?
1 votes
Les réponses sont correctes, mais ne disent pas pourquoi. Le C++ fait cela par souci de rétrocompatibilité avec le C. Historiquement, le C a été conçu sur des machines DEC PDP 16 bits et ses premières versions n'avaient pas d'interface avec le C++.
short
type. Au fur et à mesure qu'il a été porté sur de nouvelles architectures et standardisé, le C a gardé l'hypothèse selon laquelleint
est la longueur native des mots, et la taille par défaut la plus pratique pour travailler. C'est également la raison pour laquellechar
et d'autres types plus étroits queint
est automatiquement converti enint
dans certaines situations : c'est plus rapide sur de nombreuses machines, y compris le PDP.0 votes
De plus, aucune norme C ou C++ n'a jamais précisé exactement quelles étaient les plages de valeurs de l'expression
int
,long int
olong long int
sont, et ils ont été différents sur différentes architectures. Ainsi, une règle selon laquelle une constante a le type le plus étroit qui peut la contenir ferait que la même expression simple et conforme à la norme aurait un comportement différent sur deux compilateurs différents.2 votes
@Davislor : Et pourtant, c'est à peu près la règle. Les littéraux intégraux ont le plus petit type de
int, long, long long
. L'incohérence est queshort
est absent de cette liste.1 votes
Une manière rapide de vérifier le type est de sortir
typeid(3).name()
(vous devez#include <typeinfo>
pour que cela fonctionne. Le résultat seraiti
dans ce cas. Si vous le lancez surshort
vous verrezs
à la place.1 votes
@MSalters Typiquement,
int
est la taille native de la plateforme. Si elle ne tient pas dans unint
vous devrez utiliser unlong
olong long
. Mais s'il rentre dans la taille de mot native, c'est ce qu'il faut utiliser car c'est généralement ce que la plate-forme gère le mieux.1 votes
@DavidSchwartz : Bien sûr. Non pas que cela ait une réelle importance en 2017. Aucun compilateur actuel ne va en fait couler
short s = 3
de 32 à 16 bits. Le langage ne fait que définir la sémantique du forma, et c'est cette sémantique qui est le résultat de la technologie du 20ème siècle.0 votes
@MSalters Bon point.
0 votes
3 est un entier, il n'ira pas à func(short x). Il ira plutôt vers func(int x) et retournera un entier.