c++ - operator - ¿Por qué pasar el literal 3 elige la sobrecarga int en lugar de la sobrecarga corta?
overload operator() c++ (5)
¿Cómo maneja C ++ la sobrecarga de funciones en este caso?
#include <iostream>
void func(int x)
{
std::cout << "integer";
}
void func(short x)
{
std::cout << "short";
}
int main(void)
{
func(3);
}
Salida : entero
¿Porqué es eso?
La constante 3
tiene su propio tipo, en este caso es un int
. Debe convertir explícitamente su constante a short
si desea que se ejecute su sobrecarga
fun((short)3);
Las constantes tienen tipos también. Y sin un sufijo para indicar lo contrario, 3
es simplemente una constante int
. El compilador elegirá un tipo más grande si la constante es demasiado grande, pero no irá por cosas más pequeñas que un int
por defecto.
Ahora, sucede que no hay sufijo para hacer una breve constante. Necesitaría agregar un molde si desea que se llame a esa sobrecarga en particular.
Porque 3
es un entero
fun(static_cast<short>(3));
Llamaría a la versión corta.
O puede usar literales definidos por el usuario para hacer un corto: vea aquí
Tú lo estás haciendo
fun(3);
y 3 es un entero literal constante, por lo que la función que mejor se adapta a la sobrecarga es esta
void fun(int x)
{
std::cout << "integer";
}
siéntete libre de jugar un poco con los tipos y lanzando esos como:
fun(short(3));
fun(int(3));
// C++11
auto x = 3;
fun(x);
3
tiene es constante e implícitamente tiene tipo int
Para la ejecución de la función short
sobrecargada, debe usar la var short
o la constante de recast
.
short s = 3;
fun(s);
o
fun((short)3);
fun(static_cast<short>(3));
short
no tiene un sufijo como long
- L
, pero puedes crear uno.