Мне интересно узнать о поведении встроенного типа bool в С++. Насколько я понимаю, std::common_type определяет общий тип с использованием неявной конвертируемости. Я ожидал бы, что выражение с bool и другим типом приведет к преобразованию bool в этот тип. Например, я вижу, что bool + float → float и bool + double → double. Однако bool + int8_t → int32_t и bool + int16_t → int32_t. Почему это так?
Почему общий тип bool и int8_t - int32_t в С++?
Ответ 1
Короткий ответ: интегральное продвижение.
В числовой арифметике небольшие интегральные типы (включая bool, char, unsigned char, signed char, short, unsigned short и т.д.) повышаются до int, если все возможные значения соответствуют в int, в противном случае они повышаются до unsigned int.
На большинстве машин сегодня int32_t совпадает с int. В случае bool + int8_t или bool + int16_t, оба повышаются до int.