Почему конструктор выбирает INT вместо SHORT при вызове с символьным параметром?

Видно, что в приведенном ниже коде вызывается конструктор с параметром int. Я знаю, что с TG41 все в порядке. Но почему нет short? значение ASCII 'A' дает 65, которое может вместить short.

По каким критериям вызывается конструктор с параметром типа данных 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; 
}

Ответ 1

Результатом интегрального продвижения является int (не short) для char; и рекламные акции (например, charint) имеют более высокий рейтинг, чем другие конверсии (например, charshort) в разрешении перегрузки.

prvalues малых целочисленных типов (таких как char) может быть преобразован в prvalues больших целочисленных типов (таких как int).

  • signed char или signed short можно преобразовать в int;
  • unsigned char, char8_t (начиная с С++ 20) или unsigned short можно преобразовать в int, если он может содержать весь диапазон значений, и unsigned int в противном случае;
  • char можно преобразовать в int или unsigned int в зависимости от базового типа: signed char или unsigned char (см. выше);

и (выделение мое)

Note that all other conversions are not promotions; for example, overload resolution chooses charint (promotion) over charshort (conversion).

Ответ 2

Компилятор всегда выбирает наиболее подходящее разрешение перегрузки.

в твоем случае:

Тип продвижения это:

  1. Char, unsigned char или short могут быть повышены до int. Например, void f (int); может быть совпадением для f ('a');
  2. Поплавок может быть повышен до двойного.
  3. Bool может быть повышен до int (FALSE считается 0, TRUE как 1).

Ответ 3

При неявном приведении компилятор следует этому ранжированию:

  1. Полное совпадение
  2. Продвижение
  3. преобразование

Так как char to int является интегральным продвижением, оно имеет приоритет перед char и short который является конверсией.

Отсюда (выделение мое):

char может быть преобразован в int или unsigned int в зависимости от базового типа: подписанный char или unsigned char