Почему конструктор выбирает 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
; и рекламные акции (например, char
→ int
) имеют более высокий рейтинг, чем другие конверсии (например, char
→ short
) в разрешении перегрузки.
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 char
→ int
(promotion) over char
→ short
(conversion).
Ответ 2
Компилятор всегда выбирает наиболее подходящее разрешение перегрузки.
в твоем случае:
Тип продвижения это:
- Char, unsigned char или short могут быть повышены до int. Например, void f (int); может быть совпадением для f ('a');
- Поплавок может быть повышен до двойного.
- Bool может быть повышен до int (FALSE считается 0, TRUE как 1).
Ответ 3
При неявном приведении компилятор следует этому ранжированию:
- Полное совпадение
- Продвижение
- преобразование
Так как char
to int
является интегральным продвижением, оно имеет приоритет перед char
и short
который является конверсией.
Отсюда (выделение мое):
char может быть преобразован в int или unsigned int в зависимости от базового типа: подписанный char или unsigned char