Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

C style cast в С и С++

#cpp #c


C cast в С++ имеет следующую последовательность cast'ов:

const_cast
static_cast
static_cast + const_cast
reinterpret_cast
reinterpret_cast + const_cast


Есть ли отличия между C cast в С и С++?
    


Ответы

Ответ 1



О каких-то отличиях между "внешне похожими" конструкциями в совершенно разных языках программирования имеет смысл говорить только в существенно "похожих" контекстах использования, т.е. в коде, который можно условно рассматривать и как С, и как С++ одновременно. Придумать хорошие примеры таких различий непросто, особенно если требуется, чтобы различия были вызваны свойствами самого каста, а не посторонними различиями между языками. В языке С преобразования указателей к целочисленным типам недостаточного размера приводят к неопределенному поведению. В языке С++ такие преобразования не разрешены вообще. Язык С разрешает касты только из скалярных типов в скалярные типы. Язык С++, через вами же описанный механизм, разрешает касты чего угодно к чему угодно, если соответствующие преобразования определены. 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-указатель. В языке С++ этого не гарантируется. (Хотя к самому касту это различие относится лишь опосредованно.)

Комментариев нет:

Отправить комментарий