void ponteiros: diferença entre C e C ++

Eu estou tentando entender as diferenças entre C e C ++ no que diz respeito a ponteiros vazios. o seguinte compila em C, mas não em C ++ (todas as compilações feitas com gcc / g + + -ansi -pedantic -Wall):

int* p = malloc(sizeof(int));

Porquemalloc devolvevoid*, que o C ++ não permite atribuir aint* enquanto C permitir isso.

No entanto, aqui:

void foo(void* vptr)
{
}

int main()
{
    int* p = (int*) malloc(sizeof(int));
    foo(p);
    return 0;
}

C ++ e C compilam sem reclamar. Por quê?

K & R2 dizem:

Qualquer ponteiro para um objeto pode ser convertido em tipovoid * sem perda de informação. Se o resultado é convertido novamente para o tipo de ponteiro original, o ponteiro original é recuperado.

E isso resume tudo sobrevoid* conversões em C. O que o padrão C ++ determina?

questionAnswers(3)

yourAnswerToTheQuestion