В C нет необходимости приводить void *
к любому другому типу указателя, это всегда безопасно продвигается. Однако в C ++ это не так. Например,
int *a = malloc(sizeof(int));
работает в C, но не в C ++. (Примечание: я знаю, что вам не следует использовать malloc
в C ++ или в этом отношении new
, и вместо этого следует отдавать предпочтение умным указателям и / или STL; об этом спрашивается просто из любопытства) Почему стандарт C ++ не допускает такое неявное приведение, в то время как стандарт C делает?
sizeof(*a)
вместо этого.
malloc
не может вернуть указатель на выделенный тип. new
is C ++ действительно возвращает указатель на выделенный тип, так что правильно написанному коду C ++ никогда не придется приводить void *
s.
void
, C сделал не . Когда это ключевое слово / идея было добавлено в C, они изменили его в соответствии с потребностями C. Это было вскоре после того, как типы указателей начали проверяться вообще . Посмотрите, можете ли вы найти в Интернете брошюру с описанием K & R C или винтажную копию программного текста на C, такого как C Primer от Waite Group . ANSI C был полон функций, перенесенных или вдохновленных C ++, а K & R C был намного проще. Поэтому более правильно, что C ++ расширил C, как он существовал в то время, а C, который вы знаете, был удален из C ++.
long *a = malloc(sizeof(int));
К сожалению, кто-то забыл изменить только один тип!