Ответ 1
Листинг типа - это, в основном, переход от одного типа к другому. Он может быть неявным (т.е. Автоматически выполняться компилятором, возможно, потерять информацию в процессе) или явно (т.е. Указан разработчиком в коде). Пространство, занимаемое типами, имеет второстепенное значение. Более важным является применимость (а иногда и конвенция) конверсии.
Возможно, что неявные преобразования потеряют информацию, знаки могут быть потеряны/получены, и может произойти переполнение/недополнение. Компилятор не защитит вас от этих событий, за исключением, может быть, с помощью предупреждения, которое создается во время компиляции. Нарезка может также возникать, когда производный тип неявно преобразуется в базовый тип (по значению).
Для преобразований, которые могут быть совершенно опасными (например, от базы до производного типа), для стандарта С++ требуется явное преобразование. Не только это, но и предлагает более ограничительные явные приемы, такие как static_cast
, dynamic_cast
, reinterpret_cast
и const_cast
, каждый из которых дополнительно ограничивает явное приведение только подмножеством возможных преобразований, уменьшая потенциал для ошибок литья.
Допустимые преобразования, как неявные, так и эксплицированные, в конечном итоге определяются стандартами C/С++, хотя на С++ разработчик имеет возможность расширять конверсии для пользовательских типов, как неявных, так и явных, с использованием конструкторов и перегруженных ( литые) операторы.
Полные правила, для которых броски допускаются стандартами и которые не могут быть довольно сложными. Я попытался вкратце представить несколько краткое изложение некоторых из этих правил в этом ответе. Если вы действительно заинтересованы в том, что есть и что не разрешено, я настоятельно призываю вас посетить стандарты и прочитать соответствующие разделы по преобразованию типов.