Re: Приведение int** to void**.
От: Roman Odaisky Украина  
Дата: 14.03.13 23:03
Оценка: +1
Здравствуйте, 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 *.
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.