В чем разница между целочисленными акциями и целочисленными преобразованиями в C ++

StackOverflow https://stackoverflow.com/questions/4640543

Вопрос

Раздел 4.5 Стандарт C ++ (целочисленные содействия) переговоры о конкретных случаях преобразования интегральных типов на типы с более высоким рангом.

Раздел 4.7 Стандарт C ++ (интегральные преобразования) начинается с (Bullet 4.7.1):

RValue целочисленного типа может быть преобразован в RValue другого целочисленного типа. RValue типа перечисления может быть преобразован в rvalue целочисленного типа.

Насколько я понимаю преобразования, описанные в 4.5 (может быть, за исключением 4,5.3 (enums)), могут быть выполнены с использованием методик от 4.7 в одиночку: 4.5.1 и 4.5.2 полностью покрываются 4.7.1; 4.5.4 покрывается 4.7.4. Так какова цель всего 4,5 раздела? Какие дополнительные преобразования это включают? Может быть, я скучаю по некоторым ограничениям?

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

Это было полезно?

Решение

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

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top