Вы должны использовать приведения в стиле c ++, а не в стиле c.Причина в том, что то, что вы делаете, на самом деле является reinterpret_cast, который, за исключением нескольких редких случаев, практически небезопасен.
Выполнение, которое вы выполняете, выполняется неправильно.Возможно, вы сможете безопасно выполнять приведение между этими двумя значениями, это определено реализацией (согласно стандарту гарантируется, что только void * может содержать указатели на любой тип), но если вы впоследствии действительно используете новый указатель, вы вызовете носовых демонов.
Большую часть времени эти носовые демоны доброкачественны, и вы их не заметите (при достаточном количестве реализаций).Однако, если вы используете множественное наследование, эти же самые носовые демоны станут довольно хитрыми.Тем не менее, вы никогда не должны принимать неопределенное поведение как «безопасное» или что-либо иное, чем изначально плохое, если просто нет другого способа получить то, что вам нужно (как профессионал, с которым я никогда не сталкивался).
Чтоприводит всю причину НЕ использовать броски в стиле c.Есть некоторые очень, очень редкие и очень редкие состояния, когда вам приходится это делать, но как профессионал я никогда не сталкивался с ними.Проблема с приведением в стиле c заключается в том, что они будут молча менять тип броска в зависимости от семантики ситуации.Незначительные изменения кода в отдельных областях кода могут серьезно изменить операцию приведения без вашего ведома.Приведение в стиле c ++ сообщит вам, когда семантика изменилась, требуя другого типа приведения, приведение в стиле c просто молча изменится;при использовании приведения в стиле c вы можете перейти от определенного к неопределенному поведению без какой-либо подсказки, что это произошло.