En C, il n'est pas nécessaire de transtyper un void *
vers un autre type de pointeur, il est toujours promu en toute sécurité. Cependant, en C ++, ce n'est pas le cas. Par exemple,
int *a = malloc(sizeof(int));
fonctionne en C, mais pas en C ++. (Remarque: je sais que vous ne devriez pas utiliser malloc
en C ++, ou d'ailleurs new
, et que vous devriez plutôt préférer les pointeurs intelligents et / ou la STL; cela est demandé uniquement par curiosité.) Pourquoi la norme C ++ n'autorise-t-elle pas cette conversion implicite, alors que la norme C le fait?
sizeof(*a)
place.
malloc
ne peut pas retourner un pointeur sur le type alloué. new
si C ++ renvoie un pointeur sur le type alloué, le code C ++ correctement écrit n'aura jamais de void *
s à convertir.
void
, C non . Lorsque ce mot-clé / idée a été ajouté à C, ils l'ont changé pour l'adapter aux besoins de C. Ce fut peu de temps après les types de pointeur ont commencé à être vérifiés à tout . Voyez si vous pouvez trouver la brochure de description K&R C en ligne, ou une copie vintage d'un texte de programmation C comme le C Primer de Waite Group . ANSI C était plein, de fonctionnalités rétroportées ou inspirées par C ++, et K&R C était beaucoup plus simple. Il est donc plus correct que C ++ ait étendu C tel qu'il existait à l'époque, et que le C que vous connaissez a été supprimé de C ++.
long *a = malloc(sizeof(int));
Oups, quelqu'un a oublié de changer un seul type!