Мне нужно записать в отдельные байты некоторых целочисленных типов. Должен ли я использовать reinterpret_cast
или я должен использовать static_cast
с помощью void*
?
(А)
unsigned short v16;
char* p = static_cast<char*>(static_cast<void*>(&v16));
p[1] = ... some char value
p[0] = ... some char value
или (б)
unsigned short v16;
char* p = reinterpret_cast<char*>(&v16);
p[1] = ... some char value
p[0] = ... some char value
В соответствии с static_cast и reinterpret_cast для std :: align_storage «s ответ оба должны быть эквивалентны —
— если и T1, и T2 являются типами стандартной компоновки и выравниванием
требования T2 не более строгие, чем требования T1
Я склоняюсь к reinterpret_cast
как является по сути то, что я делаю, не так ли?
Есть ли что-то еще, чтобы рассмотреть, в частности, Visual-C ++ и VC8, версию, которую мы сейчас компилируем? (x86 только атм.)
В этом случае (преобразование указателей объекта), reinterpret_cast
идентичен двум вложенным static_cast
с помощью void*
5.2.10 Переинтерпретация приведения [expr.reinterpret.cast]
7 Указатель объекта может быть явно преобразован в указатель объекта
другого типа. 72 Когда значение v типа указателя на объект
преобразуется в указатель объекта типа «указатель на cv T», в результате
static_cast<cv T*>(static_cast<cv void*>(v))
. Преобразование значения
введите «указатель на T1» на тип «указатель на T2» (где T1 и T2
типы объектов и где требования выравнивания T2 не
более строгие, чем у T1), и обратно в исходный тип дает
исходное значение указателя.
Лучше использовать reinterpret_cast
в сигнализировать о своем намерении Вот.
ОБНОВИТЬ: как упоминалось в комментариях, это, по-видимому, было добавлено в C ++ 11, хотя большинство компиляторов C ++ 98 уже поддерживали его (см. также этот вопрос&)