В чем разница между целочисленными акциями и целочисленными преобразованиями в C ++
-
09-10-2019 - |
Вопрос
Раздел 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)
Потому что это лучший кандидат.
Другие советы
Акции происходят во время арифметики и других операций. Преобразование происходит, когда просто сохраняя один интегральный тип внутри другого.