Здравствуйте, Licwin, Вы писали:
L>Почему следующий код компилируется с ошибкой "error C2440: '=' : cannot convert from 'int **' to 'void **'" (VC2012)?
L>void** p;
int* x;
p = &x;
Потому что это позволило бы написать
double d;
*p = /* (void *) */ &d;
что то же самое, что x = &d, что, очевидно, недопустимо.
Это из той же оперы ария, что и вопрос «является ли список Кошек списком Животных»? Проблема в том, что при типичном интерфейсе X Container<X>::get(), void Container<X>::add(X) операция чтения ковариантна (Container<Cat> реализует интерфейс Animal get()), в то время как операция записи контравариантна (Container<Cat> не может реализовать void add(Animal); наоборот, Container<Animal> умеет add(Cat)). Так что void ** не является более общим типом, чем int **, поэтому приведение и невозможно, в отличие от int * к void *.