Тип-литье в С++

Я изучаю С++ на два месяца, используя книгу: Принципы программирования и практику с использованием С++, и теперь я хотел уточнить некоторые сомнения относительно моего кастинга. Когда я выполняю неявное преобразование, например:

char c = 'a'; 
int b = c; 

Здесь значение c неявно преобразуется в тип int без использования какого-либо явного оператора. Рассматривается ли это кастинг? или его рассмотренное кастинг, только когда я должен выполнить явное преобразование, как в:

int a = 10; 
int b = 5.5; 
double sum = double (a) / b; 

Я знаю, это может показаться глупым вопросом, но я просто хотел быть уверенным в конверсиях.

Ответы

Ответ 1

"Кастинг" выполняется только при явном преобразовании.

Как говорится, вы найдете этот термин неправильно используемым во всем Интернете и в разных командах!

Ответ 2

Как упоминалось в других ответах, броски написаны явно. Стандарт относится к ним как к явным преобразованиям типов; [Expr.cast]/2:

Явное преобразование типа может быть выражено с использованием функциональной нотации (5.2.3), оператор преобразования типа (dynamic_cast, static_cast, reinterpret_cast, const_cast) или литой нотации.

Существует три вида выражений, которые мы называем casts, упомянутые в приведенной выше цитате:

  • (T)expr. В стандарте эта форма называется литой записью преобразования явного типа и также обычно называется литой C-стиля (так как она является синтаксисом, используемым и унаследованным от C). (double) a - пример.

  • T(expr). Это функциональная нотация (также называемая литой в стиле функции). Часто используется для создания временных типов класса, например. std::string("Hello World"). double(a) - это также функция-стиль.

  • И последнее, но не менее важное: так называемые операторы преобразования типов static_cast<T>(expr), reinterpret_cast, const_cast и dynamic_cast. Это самые явные обозначения и индивидуально более ограничены.

Использование всех этих функций описано в этом Q/A.

Каждое другое преобразование не называется литой.

Ответ 3

Расширение (сохранение значений) - конверсии, результаты которых при преобразовании обратно в исходный тип дадут исходное значение - обычно выполняются неявно. Это

char c = 'x'; 
int b = c;

является неявным преобразованием. Явные преобразования называются приведениями.

int a = 1;
double sum = static_cast<double>(a) / b;

Здесь литье a в double явно выполняется как как a, так и b int s; без преобразования никакого преобразования не произойдет, что приведет к целочисленному делению, в то время как разделение с плавающей запятой может быть предпочтительным, поскольку оно может быть более точным. Выделение одного из операндов от / до double, что приведет к тому, что другое будет неявно преобразовано в double тоже, и, следовательно, деление (и его результат) теперь будет плавающей точкой.

Если бы вы делали только double x = a;, вы можете покончить с явным преобразованием, поскольку int неявно преобразован в double (живой пример). Из стандарта С++ 11 проект N3337

- если один из операндов является двойным, другой должен быть преобразован в double.

См. здесь для полного списка неявных преобразований.

Ответ 4

Кастинг - это явное преобразование переменных в выражение. Как этот

int a = 10; 
int b = 5.5; 
double sum = double (a) / b; 

В то время как этот

char c = 'a'; 
int b = c;

.. является примером неявного преобразования типов (или иногда принуждения), где типы данных неспецифически продвигаются от одного типа к другому [например, char to int]

Взгляните на эту статью для более глубокого понимания.

Ура!

Ответ 5

Это не кастинг, а стандартное преобразование, поскольку состояние n3337 в С++ стандартно в

§ 4 Стандартные преобразования

4.5 Целочисленные акции

1) Prvalue целочисленного типа, отличного от bool, char16_t, char32_t, или wchar_t, чей целочисленный ранг преобразования (4.13) меньше ранга int может быть преобразован в prvalue типа int, если int может представлять все значения типа источника; в противном случае исходное значение может преобразуется в prvalue типа unsigned int.