tipos - ¿Cuál es el tipo de C++ resultante de la adición?
tipos de datos en c++ (3)
Obtengo el error de compilación "llamada ambigua" para esto:
short i;
MyFunc(i+1, i+1);
Donde hay dos definiciones para MyFunc: una que toma dos cortos y la otra toma dos carrozas.
Cuando yo escribo:
MyFunc(i, i+1);
No hay ningún error: el compilador deduce corto.
Mi pregunta es, ¿por qué ''corto'' + 1 puede resultar como un punto flotante, y cómo puedo evitar revisar todo mi código y agregar expresiones explícitas como:
MyFunc((short)(i+1), (short)(i+1));
Gracias.
Como se explica aquí al usar operaciones short
en operaciones aritméticas, primero debe convertirse en un int
. Así que en realidad el compilador está tratando de encontrar el MyFunc(int,int)
correcto MyFunc(int,int)
y tiene que elegir entre MyFunc(short,short)
y MyFunc(float,float)
, de ahí la ambigüedad.
i+1
se promociona a int
ya que short
es un tipo integral más pequeño que int
.
así que MyFunc(i+1, i+1);
es " MyFunc(int, int);
"
Puede resolver la ambigüedad agregando sobrecarga, lo que hace que el despacho espere, algo así como:
void MyFunc(short, short);
void MyFunc(float, float);
template <typename T1, typename T2>
std::enable_if<std::is_floating_point<T1>::value ||
std::is_floating_point<T2>::value>
MyFunc(T1 t1, T2 t2)
{
MyFunc(static_cast<float>(t1), static_cast<float>(t2));
}
template <typename T1, typename T2>
std::enable_if<!std::is_floating_point<T1>::value &&
!std::is_floating_point<T2>::value>
MyFunc(T1 t1, T2 t2)
{
MyFunc(static_cast<short>(t1), static_cast<short>(t2));
}
Durante la adición, si los operandos son más pequeños que int
, se promueven a int
y el resultado de i + 1
es también un int
. Para más información, consulte este enlace . En este punto, durante la resolución de sobrecarga, se produce una conversión integral al tipo de flotación.