【问题标题】:Why does constructor choose type INT instead of SHORT when invoked with a parameter of type CHAR?为什么构造函数在使用 CHAR 类型的参数调用时选择 INT 类型而不是 SHORT 类型?
【发布时间】:2019-07-24 08:32:28
【问题描述】:

可以看出,在下面的代码中,参数类型为int 的构造函数被调用。我知道int 在这里很好。但为什么不short'A' 的 ASCII 值给出了 short 可以容纳的 65。

在什么条件下调用带有数据类型int的参数的构造函数?


#include<iostream>

class RightData
{
    int x; 
    public:
    RightData(short data)
    {
        cout<< "Short" << endl;
    }
    RightData(int data)
    {
        cout<< "Int" << endl;
    }
    RightData(float data)
    {
        cout<< "Float" << endl;
    }
    ~RightData() 
    {
        cout<< "Final";
    }
};
int main()
{
    RightData *ptr = new RightData('A');
    return 0; 
}

【问题讨论】:

    标签: c++ c++11 types constructor overload-resolution


    【解决方案1】:

    integral promotion 的结果是int(不是short)对于char;和促销(例如char -> int)比overload resolution中的其他转化(例如char -> short)具有更高的ranking

    小整数类型(如char)的纯右值可以转换为较大整数类型(如int)的纯右值。

    • signed charsigned short可以转换为int
    • 如果unsigned charchar8_t(C++20 起)或unsigned short 可以保持其整个值范围,则可以转换为int,否则unsigned int
    • char 可以根据底层类型转换为 intunsigned intsigned charunsigned char(见上文);

    和(强调我的)

    请注意,所有其他转化都不是促销;例如,overload resolution 选择 char -> int(促销)而不是 char -> short(转化)

    【讨论】:

      【解决方案2】:

      编译器总是选择best matching 重载分辨率。

      在你的情况下:

      类型提升是:

      1. 可以将 char、unsigned char 或 short 提升为 int。例如 void f(int);可以匹配 f('a');
      2. 浮点数可以提升为双精度数。
      3. bool 可以提升为 int(FALSE 计为 0,TRUE 计为 1)。

      【讨论】:

        【解决方案3】:

        当隐式转换时,编译器遵循ranking:

        1. 完全匹配
        2. 促销
        3. 转换

        由于charint 是积分促销,它优先于charshort,这是转换

        来自here(强调我的):

        char 可以转换为 int 或 unsigned int,具体取决于底层类型:signed char 或 unsigned char

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-06
          • 1970-01-01
          • 2021-08-17
          • 1970-01-01
          • 1970-01-01
          • 2011-07-18
          • 2015-11-05
          相关资源
          最近更新 更多