2

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

enter image description here

Означает ли, что следующий код имеет неопределенное поведение?

#include <iostream> 

void function(unsigned int){ 
    std::cout << "unsigned\n"; 
} 
void function(int){ 
    std::cout << "signed\n"; 
} 

int main() { 
    char c; 
    function(c); 
} 

У меня нет предупреждений компилятора. Всегда ли оно решит «подписаться»?

+0

До тех пор, как 'sizeof int> sizeof char', да. –

+0

Точнее, если 'int' может представлять каждое значение, которое может быть' unsigned char'. Следствием этого является практически то, что 'sizeof int> sizeof char (= 1)'. – Peter

+0

Возможный дубликат [Нужно ли передавать тэг без знака перед вызовом toupper?] (Http://stackoverflow.com/questions/21805674/do-i-need-to-cast-to-unsigned-char-before-calling -toupper) –

ответ

3

Ваша диаграмма верна для случаев целая продвинутая активность. Однако в коде function(c) целочисленного продвижения не происходит. Это фактически разрешение перегрузки. Если был только один function, то c - преобразован (не продвигается) к типу параметра, в зависимости от того, что это.

В правилах разрешения перегрузки, если аргумент можно было бы согласовать с параметром целым продвижением по службе, то эта функция будет считаться лучшим совпадением, чем другая функция, в которой требуется целочисленное преобразование .

См. Таблицу 12 в C++ 14 (часть раздела 13.3.3.1.2), в которой перечислены ряды неявных последовательностей преобразования для разрешения перегрузки.

Таким образом, ваш образец кода будет звонить function(unsigned int) по системе с CHAR_MAX > INT_MAX.

Однако размеры типов не определены, а не не указано.

-1

Это всего лишь один вид функции C++, называемый «Имплицитное преобразование типа/автоматическое преобразование типа/принуждение». когда вы передаете символ функции, символ был преобразован в подписанный int неявно. Так же, как код «int a = 'C»; Вы можете узнать больше о принуждении отсюда: http://www.learncpp.com/cpp-tutorial/44-implicit-type-conversion-coercion/

Под капотом все типы представлены в виде двоичного числа. Таким образом, тип является лишь одним из способов объяснения компиляции. Нет такого механизма, о котором вы заявляете выше

1

A char почти всегда будет преобразован в int. Всякий раз, когда sizeof(int) > sizeof(char) затем char будет повышаться до int, независимо от того, подписан он или нет, как вы сказали, int может содержать весь диапазон char.

Единственный раз, когда вы могли получить unsigned int, - это когда sizeof(char) == sizeof(int). В этом случае, если char не имеет знака, он будет преобразован в unsigned int, поскольку int не сможет удерживать весь диапазон значений.

Это может произойти, так как стандарт только диктует, что int должен иметь по крайней мере столько памяти, как char, так что может быть какая-либо система, которая имеет 32-битные байты, и они делают char и int того же размера.

Так это реализация определяется поведение, как вы должны знать реализации определенного размера обоих типов и реализации определенного знаковость char знать, что будет происходить.