Я пытаюсь понять различия между C и С++ в отношении указателей void. следующие компиляции в C, но не С++ (все компиляции, выполненные с помощью gcc/g++ -ansi -pedantic -Wall):
int* p = malloc(sizeof(int));
Потому что malloc
возвращает void*
, который С++ не позволяет назначать int*
, в то время как C разрешает это.
Однако здесь:
void foo(void* vptr)
{
}
int main()
{
int* p = (int*) malloc(sizeof(int));
foo(p);
return 0;
}
Оба С++ и C скомпилируют его без жалоб. Почему?
K & R2 говорят:
Любой указатель на объект может быть преобразован в тип
void *
без потерь информации. Если результат преобразован обратно в исходный указатель тип, исходный указатель выздоровел.
И это довольно суммирует все, что есть о void*
преобразованиях в C. Что диктует стандарт С++?