【问题标题】:What is the C++ type resulting from addition加法产生的 C++ 类型是什么
【发布时间】:2018-04-22 04:52:45
【问题描述】:

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

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

MyFunc 有两种定义 - 一种采用两条短裤,另一种采用两种浮点型。

当我写作时:

MyFunc(i, i+1);

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

我的问题是,为什么 'short' + 1 可能会导致浮点数,以及如何避免检查所有代码并添加显式强制转换,例如:

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

谢谢。

【问题讨论】:

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


    【解决方案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));
    }
    

    【讨论】:

      【解决方案2】:

      在加法过程中,如果操作数小于int,则将它们提升为inti + 1 的结果也是int。更多信息请查看link。此时,在overload resolution 期间,发生了浮点类型转换。

      【讨论】:

        【解决方案3】:

        正如here 解释的那样,在算术运算中使用short 时,必须首先将其转换为int。所以实际上编译器正在尝试找到正确的MyFunc(int,int),并且必须在MyFunc(short,short)MyFunc(float,float),因此含糊不清。

        【讨论】:

          猜你喜欢
          • 2013-10-26
          • 2020-06-26
          • 2016-10-01
          • 2018-07-20
          • 1970-01-01
          • 2021-11-19
          • 1970-01-01
          • 2013-05-27
          • 2011-07-01
          相关资源
          最近更新 更多