繁体   English   中英

添加产生的C ++类型是什么

[英]What is the C++ type resulting from addition

我收到了“模糊调用”编译错误:

short i;
MyFunc(i+1, i+1);

MyFunc有两个定义 - 一个带两个短裤,另一个带两个浮子。

我写的时候:

MyFunc(i, i+1);

没有错误 - 编译器推断短。

我的问题是,为什么“短”+ 1可能会导致浮点,我怎样才能避免遍历所有代码并添加显式的强制转换,例如:

MyFunc((short)(i+1), (short)(i+1));

谢谢。

i+1被提升为int因为short是比int更小的整数类型。

所以MyFunc(i+1, i+1); 是“ MyFunc(int, int);

您可以通过添加执行预期调度的重载来解决模糊性,例如:

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));
}

正如这里所解释的那样在算术运算中使用short时,必须首先将其转换为int 。因此,编译器实际上正在尝试找到正确的MyFunc(int,int)并且必须在MyFunc(short,short)MyFunc(float,float) MyFunc(short,short)之间进行选择。 MyFunc(float,float) ,因此模棱两可。

在添加期间,如果操作数小于int ,则它们被提升为int ,而i + 1的结果也是int 有关更多信息,请查看此 此时,在过载分辨率期间,会发生浮点类型转换的积分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM