W void* a, ajest zadeklarowany jako wskaźnik nie do voidtypu, ale do typu „dowolnego” (przypadek specjalny). Adres (pozycja w pamięci) jest przypisany a, tak jak każdej innej deklarowanej zmiennej, oczywiście.
Następnie wyrażenie &ajest oceniane w celu zainicjowania zmiennej (również a, ale nie ma to znaczenia) właśnie zadeklarowanej. Typ &ato „wskaźnik do wskaźnika do dowolnego typu”, co jest specjalnym przypadkiem „wskaźnika do dowolnego typu”, w pełni zgodnym z typem a. Ergo, brak wiadomości kompilatora.
Wniosek: nie używaj, void*jeśli chcesz silnego sprawdzania typu. Wszystko można na to przekonwertować. Wręcz przeciwnie w odwrotnym kierunku, z wyjątkiem void*siebie samego (byłby to niepotrzebny wyjątek, że typ byłby ze sobą niezgodny).
AFAIR to naprawdę pochodzi od C.