Это не так.Единственная гарантия при приведении к void*
с использованием static_cast
:
Значение указателя типа на объект, преобразованное в «указатель на cv void
» и обратно в исходный указательТип будет иметь свое первоначальное значение (C ++ 03 §5.2.9 / 10).
Например, следующий код неверен, потому что void*
приведен к типу, отличному от оригиналатип указателя (последовательность приведения B1*
-> void*
-> B2*
):
struct B1 { int i; };
struct B2 { int j; };
struct D : B1, B2 { };
D x;
B1* b1ptr = &x;
void* voidptr = b1ptr;
B2* b2ptr = static_cast<B2*>(voidptr);
Попытка использовать b2ptr
здесь приведет к неопределенному поведению.Единственный тип, к которому вы можете безопасно привести voidptr
, это B1*
, так как это тип, из которого был получен void*
(ну, или char*
, поскольку ко всему можно получить доступ через char*
).