Почему общий тип bool и int8_t - int32_t в С++?

Мне интересно узнать о поведении встроенного типа bool в С++. Насколько я понимаю, std::common_type определяет общий тип с использованием неявной конвертируемости. Я ожидал бы, что выражение с bool и другим типом приведет к преобразованию bool в этот тип. Например, я вижу, что bool + floatfloat и bool + doubledouble. Однако bool + int8_tint32_t и bool + int16_tint32_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.