На некоторых архитектурах указатель может быть больше, чем просто адрес. Изменение типа указателя может изменить его битовую комбинацию, даже если он не изменяет указанный адрес.
ущем проекте стандарта (и C ++ 17),это написано о static_castingvoid *
:
Значение типа «указатель наCV1 void »можно преобразовать в значение типа« указатель наCV2 T ”, где T - тип объекта иCV2 является той же квалификацией cv или большей квалификацией, чемCV1, Если исходное значение указателя представляет адрес A байта в памяти и A не удовлетворяет требованию выравнивания T, то полученное значение указателя не определено. В противном случае, если исходное значение указателя указывает на объектaи есть объектb типа T (игнорируя cv-квалификацию), которая может быть преобразована в указательaрезультат - указатель наb, В противном случае значение указателя не изменяется при преобразовании.
Интересно, а какая разница, является ли преобразование взаимно конвертируемым или нет? Есть ли случай, когдаvoid *
что-то взаимозаменяемое указатель на самом деле меняет значение указателя? Какова цель этого различия?
Для полнотывзаимозаменяемый указатель:
Два объекта a и b являются взаимозаменяемыми по указателю, если:
(4.1) это один и тот же объект, или(4.2) один является объектом объединения, а другой - нестатическим членом данных этого объекта ([class.union]), или(4.3) один является объектом класса стандартной компоновки, а другой - первым нестатическим членом данных этого объекта, или, если объект не имеет нестатических членов данных, любой подобъект базового класса этого объекта ([класс. mem]) или(4.4) существует объект c такой, что a и c являются взаимно конвертируемыми по указателю, а c и b являются взаимно конвертируемыми по указателю.Если два объекта являются взаимозаменяемыми по указателю, то они имеют одинаковый адреси можно получить указатель на один из указателя на другой через reinterpret_cast.