В чем разница между целочисленной рекламой и целочисленной конверсией в C++
Раздел 4.5 стандарта C++ (целочисленное продвижение) говорит о конкретных случаях преобразования целочисленных типов в типы с более высоким рангом.
Раздел 4.7 стандарта C++ (интегральные преобразования) начинается с (п. 4.7.1):
Значение r целого типа может быть преобразовано в значение другого целого типа. Значение r типа перечисления может быть преобразовано в значение типа integer.
Насколько я понимаю, преобразования, описанные в 4.5 (возможно, за исключением пункта 4.5.3 (перечисления)), могут быть выполнены с использованием техник только из раздела 4.7: 4.5.1 и 4.5.2 полностью охвачены 4.7.1; 4.5.4 покрывается 4.7.4. Так в чем же смысл всего раздела 4.5? Какие дополнительные преобразования он позволяет? Может быть, мне не хватает некоторых ограничений?
PS Я читаю C++03 стандартную версию.
2 ответа
Я думаю, что различие важно, потому что оба они не попадают в одну и ту же категорию конверсии и имеют разные ранги (см. 13.3.3.1.1, Стандартные последовательности конверсии). Ранг имеет значение, когда дело доходит до разрешения перегрузки:
Стандартные последовательности конверсии упорядочены по их рангу: точное совпадение - это лучшая конверсия, чем рекламная акция, которая лучше конверсии, чем конверсия.
В конце концов, я считаю, что именно различие между 4.5 и 4.7 делает следующий код однозначным:
#include <iostream>
void foo(int i) { std::cout << "foo(int)" << std::endl; }
void foo(unsigned short i) { std::cout << "foo(unsigned short)" << std::endl; }
int main()
{
foo(static_cast<short>(1));
}
short
вint
является продвижением (таким образом, имеет звание повышения)short
вunsigned short
конверсия (таким образом, имеющая рейтинг конверсии)
В конце концов, этот код вызывает foo(int)
потому что это лучший кандидат.
Акции происходят во время арифметических и других операций. Преобразования происходят при простом хранении одного целого типа внутри другого.