26 votes

Pourquoi le passage du littéral 3 choisit-il la surcharge int au lieu de la surcharge short ?

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

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 laquelle int est la longueur native des mots, et la taille par défaut la plus pratique pour travailler. C'est également la raison pour laquelle char et d'autres types plus étroits que int est automatiquement converti en int dans certaines situations : c'est plus rapide sur de nombreuses machines, y compris le PDP.

58voto

StoryTeller Points 6139

Les constantes ont aussi des types. Et sans suffixe pour indiquer le contraire, 3 est simplement un int constant. Le compilateur choisira un type plus grand si la constante est trop grande, mais il n'ira pas vers des choses plus petites qu'un int par défaut.

Il se trouve qu'il n'y a pas de suffixe pour faire une constante courte. Vous devez ajouter un cast si vous voulez que cette surcharge particulière soit appelée.

9 votes

Ou vous créez un suffixe :)

1 votes

operator "" il semble que, soigné fr.cppreference.com/w/cpp/language/user_literal

29voto

kocica Points 5856

Littéral 3 est une constante et est implicitement de type int par la conception de la langue.

Pour votre short exécution de la fonction surchargée, vous devez utiliser short variable :

short s = 3;
fun(s);

ou lancer la constante correctement :

fun((short)3);
fun(static_cast<short>(3));

Tipo short n'a pas de suffixe comme par exemple long ( long l = 42L; ), mais vous pouvez en créer un.

17voto

doctorlove Points 7649

Parce que 3 est un nombre entier.

fun(static_cast<short>(3));

appellerait la version courte.

Ou vous pouvez utiliser des littéraux définis par l'utilisateur pour faire un court : Voir aquí

6voto

Vous faites

fun(3);

y 3 est un constante littérale entero donc la fonction qui correspond le mieux à la surcharge est celle-ci

void fun(int x)
{
    std::cout << "integer";
}

N'hésitez pas à jouer un peu avec les types et le casting qui vous conviennent :

fun(short(3));
fun(int(3));
// C++11
auto x = 3;
fun(x);

6voto

Boris Points 302

La constante 3 a son propre type, dans ce cas, c'est une int . Vous devez explicitement convertir votre constante en short si vous voulez que votre surcharge exécute

fun((short)3);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X