C cast в С++ имеет следующую последовательность cast'ов:
const_cast
static_cast
static_cast + const_cast
reinterpret_cast
reinterpret_cast + const_cast
Есть ли отличия между C cast в С и С++?
О каких-то отличиях между "внешне похожими" конструкциями в совершенно разных языках программирования имеет смысл говорить только в существенно "похожих" контекстах использования, т.е. в коде, который можно условно рассматривать и как С, и как С++ одновременно. Придумать хорошие примеры таких различий непросто, особенно если требуется, чтобы различия были вызваны свойствами самого каста, а не посторонними различиями между языками.
В языке С преобразования указателей к целочисленным типам недостаточного размера приводят к неопределенному поведению. В языке С++ такие преобразования не разрешены вообще.
Язык С разрешает касты только из скалярных типов в скалярные типы. Язык С++, через вами же описанный механизм, разрешает касты чего угодно к чему угодно, если соответствующие преобразования определены.
struct A;
struct B;
struct B *foo(struct A *a)
{
return (struct B *) a;
}
Такое преобразование в языке С расценивает типы указателей как никак не связанные между собой, т.е. это преобразование фактически эквивалентно (struct B *) (void *) a.
В языке С++, однако, компилятору в таком преобразовании разрешается на свое усмотрение учитывать или не учитывать информацию о возможном отношении наследования между типами struct A и struct B, даже если эта информация становится доступна (т.е. типы становятся полными) только ниже точки выполнения преобразования.
В языке С такая инициализация
int *p = (int *) (2 - 2);
порождает null-указатель. В языке С++ этого не гарантируется. (Хотя к самому касту это различие относится лишь опосредованно.)
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости