2015-01-14 4 views
0
struct Foo {}; 
... 
void * p = (Foo*)0; // OK 
void ** pp = (Foo**)0; // Invalid conversion 

Насколько я помню, указатель на любой тип не указателя может быть неявным образом перенесен на void* в C++. Почему тогда то же самое не допускается для литья ponter к типу указателя до void**?Неверное преобразование из Foo ** в void ** - почему неявное преобразование типа разрешено void *, но не void **?

ответ

3

Указатель может быть неявным образом переведен на void *, поскольку void * является общим указателем. Однако void ** не является общим указателем на указатель.

C FAQ 4.9 объясняет, почему нет общего указателя на тип указателя в C, я думаю, что это относится и к C++.

+0

Спасибо, это обучающее чтение. Я до сих пор не могу представить себе архитектуру, в которой выполнение '(void **) & (Foo *)' недопустимо, но тот факт, что стандарт запрещает это, - это что-то рассмотреть. –

+0

@ Violet Giraffe Архитектура не имеет значения. Выполнение этого (с реальной переменной как минимум) является неопределенным поведением, компилятор теоретически может сделать что-либо. – 2501

Смежные вопросы