Почему common_type <long, unsigned long> :: type = long long?
common_type::type
являетсяunsigned long
потому что относительно операндов после интегрального продвижения стандарт говорит ...
[...] если операнд с целочисленным типом без знака имеет ранг, больший или равный рангу типа другого операнда, операнд с целочисленным типом со знаком должен быть преобразован в тип операнда с целочисленным типом без знака
Не называть интегральную систему продвижения ошибочной, но кажется, что если существует целочисленный тип со знаком большего размера, который может представлять диапазон как операндов со знаком, так и без знака, его следует использовать.
Я знаю, что некоторые платформы могут иметь long == long long, и в этом случае вышеуказанное правило может вступить в силу. Но если тамявляется больший подписанный целочисленный тип, не долженэто будет использоваться?