Почему перегрузка функции, которая принимает int, предпочтительнее, чем та, что принимает неподписанный символ?

Рассмотрим эту программу:

#include <iostream>

using namespace std;

void f(unsigned char c) {
cout << c << endl;
}

void f(int c) {
cout << c << endl;
}

int main() {
f('a');
}

Это распечатывает 97, предполагая, что f() была выбрана перегрузка, которая int, Я нахожу это странным; не будет интуитивно unsigned char лучше подходить для char?

5

Решение

не будет интуитивно unsigned char лучше подходить для char?

Ну, я думаю, но не в соответствии со стандартом. В соответствии с [conv.prom]p1:

Значение типа integer, отличного от bool, char16_­t, char32_­t, или же wchar_­t чей ранг целочисленного преобразования меньше, чем ранг целого, может быть преобразован в тип значения int если int может представлять все значения типа источника; […]

Теперь три типа символов имеют одинаковый ранг, а тип со знаком имеет ранг всегда меньше int, Это сочетание [conv.rank]p1.6 а также [conv.rank]p1.2:

  • Ранг целочисленного типа со знаком должен быть больше ранга целочисленного типа со знаком меньшего размера.

  • […]
  • Звание char равняется званию signed char а также unsigned char,

По сути, каждый персонаж всегда имеет меньший ранг, чем int и все они могут быть представлены в intи так перегрузка с unsigned char не лучшее совпадение, потому что это будет включать в себя преобразование из char в unsigned charвместо продвижения по службе.

Если вы измените свою перегрузку, чтобы принять charтогда будет точное совпадение, и, естественно, будет выбрана «правильная» перегрузка (на ваш взгляд).

8

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector