Во-первых, конечно: указатель гарантированно будет выровнен в первом случае (согласно §5.3.4 / 10 и §3.7.4.1 / 2) и может быть правильно выровнен в обоих случаях. (Очевидно, если sizeof(int) == 1
, но даже если это не так, реализация не обязательно требует согласования.)
И чтобы прояснить ситуацию: все ваши броски reinterpret_cast
.
Помимо этого, это интересный вопрос, потому что, насколько я могу судить, в отношении стандарта нет никакой разницы в двух приведениях. Результаты преобразования не указаны (согласно §5.2.10 / 7); у вас даже нет гарантии, что преобразование его обратно в char*
приведет к исходному значению. (Очевидно, этого не произойдет, например, на машинах, где int*
меньше char*
.)
На практике, конечно: стандарт требует, чтобы возвращаемое значение new char[N]
было достаточно выровнено для любого значения, которое может в него вписаться, поэтому вы гарантированно сможете:
intPtr = new (charPtr) int;
Это имеет точно такой же эффект, как и ваш приведение, учитывая, что конструктор по умолчанию для int
не работает. (И при условии, что sizeof(int) <= 42
.) Так что трудно представить реализацию, в которой первая часть не работает. У вас должна быть возможность использовать intPtr
, как и любой другой intPtr
, полученный легальным путем. И идея о том, что преобразование его обратно в char*
каким-то образом приведет к отличному от исходного char*
значению, кажется абсурдной.
Во второй части все ставки отключены: вы определенно не можете разыменовать указатель (если ваша реализация не гарантирует иное), и также вполне возможно, что преобразование его обратно в char*
приведет к чему-то другому. (Представьте, например, машину, адресуемую по слову, в которой преобразование char*
в int*
округляется в большую сторону. Тогда обратное преобразование приведет к char*
, который был на sizeof(int)
выше исходного. Или когда попытка преобразовать неверно выровненный указатель всегда приводила к нулю указатель.)
person
James Kanze
schedule
08.02.2013
intPtr
, произойдет невыровненный доступ (на соответствующих процессорах). Так что это определенно было бы неприемлемо. Хотя это может работать на некоторых процессорах - например, x86 с радостью, если будет немного медленнее, будет читать невыровненную память. - person Mats Petersson   schedule 08.02.2013intPtr
, могу ли я хотя бы преобразоватьintPtr
вchar*
и повторно получить исходный действительный указатель для suresies? - person Lightness Races in Orbit   schedule 08.02.2013T1
иT2
являются типами объектов и где требования выравниванияT2
не строже, чем требованияT1
, в противном случае это не указано ([C++11: 5.2.10/7]
). - person Lightness Races in Orbit   schedule 08.02.2013C++
лучше использоватьstatic_cast
вместоC
стилей. - person Ivaylo Strandjev   schedule 08.02.2013static_cast
здесь незаконен. Ему придется использоватьreinterpret_cast
. - person James Kanze   schedule 08.02.2013