В чем разница между целочисленной рекламой и целочисленной конверсией в C ++ - PullRequest
5 голосов
/ 09 января 2011

Раздел 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? Какие дополнительные преобразования он позволяет? Может быть, мне не хватает некоторых ограничений?

P.S. Я читаю версию стандарта C ++ 03.

Ответы [ 2 ]

8 голосов
/ 09 января 2011

I думаю , что различие важно, поскольку оба они не попадают в одну категорию конверсии и имеют различный ранг (см. 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), потому что это лучший кандидат.

4 голосов
/ 09 января 2011

Акции происходят во время арифметических и других операций.Преобразования происходят при простом хранении одного интегрального типа внутри другого.

...