Если я делаю следующее, все в порядке:
char* cp = "abc";
void* vp = NULL;
vp = static_cast<void*>(cp);//ok
cp = static_cast<char*>(vp);//ok
Но нет следующего:
char** cpp = &cp;
void** vpp = NULL;
vpp = static_cast<void**>(cpp);//error C2440: 'static_cast':
//cannot convert from 'char **' to 'void **'
cpp = static_cast<char**>(vpp);//error C2440: 'static_cast':
//cannot convert from 'void **' to 'char **'
Пожалуйста, может кто-нибудь объяснить мне, почему вторые примеры не разрешены. Пожалуйста, не цитируйте стандарт С++ как весь ответ, потому что я уже видел ответы, в которых он цитируется, и я не понимаю, что они имели в виду. Я хочу понять, почему вторые примеры не работают (т.е. если бы вы могли привести пример, где это было бы опасно, это было бы большим подспорьем). Потому что я не понимаю. Для меня оба примера являются указателями приведения. Почему дополнительный уровень косвенности имеет значение?
void *
и выполнить статическое приведение в обратном направлении. Но это неверно дляT*
иU*
в целом, которые не связаны между собой. (Теперь подумайтеT = char*
иU = void*
.) - person Kerrek SB   schedule 29.04.2013char**
вvoid*
и наоборот. - person Code-Apprentice   schedule 29.04.2013