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

时间:2017-11-09 09:05:01

标签: c++ compiler-errors type-conversion

我正在接受"模棱两可的电话"编译错误:

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

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

当我写:

MyFunc(i, i+1);

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

我的问题是,如何缩短' + 1可能会导致浮点,我怎样才能避免遍历所有代码并添加显式转换,例如:

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

感谢。

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

正如here在算术运算中使用short时所解释的那样,它必须首先转换为int。所以实际上编译器正试图找到正确的MyFunc(int,int)和必须在MyFunc(short,short)MyFunc(float,float)之间进行选择,因此存在歧义。

答案 2 :(得分:1)

在添加期间,如果操作数小于int,则会将其提升为inti + 1的结果也为int。有关详情,请查看此link。此时overload resolution期间会发生浮点类型转换的积分。