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?
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.
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.
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
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);
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);