web-dev-qa-db-fra.com

Pourquoi passer le littéral 3 choisit-il la surcharge int au lieu de la surcharge courte?

Comment C++ gère-t-il la surcharge de 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 donc?

27
Gaurav

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

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

59
StoryTeller

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

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

short s = 3;
fun(s);

ou lancer la constante correctement:

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

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

29
kocica

Car 3 est un 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 ici

17
doctorlove

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

fun((short)3);
6
Boris

Tu es en train de faire

fun(3);

et 3 est une constante littérale entier de sorte que 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 à les lancer comme:

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