reinterpret_cast и static_cast для записи байтов в типах стандартной компоновки?

Мне нужно записать в отдельные байты некоторых целочисленных типов. Должен ли я использовать 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 только атм.)

9

Решение

В этом случае (преобразование указателей объекта), 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 уже поддерживали его (см. также этот вопрос&)

13

Другие решения


По вопросам рекламы [email protected]