В чём смысл существования reinterpret_cast?

233
11 сентября 2017, 05:24

В C++ существует оператор reinterpret_cast, смысл которого заключается в приведении между типами, несовместимыми друг с другом.

Однако подобные преобразования нарушают strict aliasing rule, что провоцирует неопределённое поведение. Те же преобразования, которые этого правила не нарушают, укладываются в const_cast, static_cast и dynamic_cast.

В чём же тогда заключается смысл существования данного оператора, если его использование нарушает стандарт?

Answer 1

Существует ровно один вид преобразования между несовместимыми типами, не нарушающий strict aliasing rule — из произвольного указателя на указатель типа char*. То есть reinterpret_cast позволяет представить произвольный объект в виде последовательности байт (так как стандартом гарантируется однобайтовая длина char-а).

Вот пример грамотного использования этого вида преобразования:

template<class T>
void putIntoStream(const T* object, std::ostream& out)
{
    out.write(reinterpret_cast<const char*>(object), sizeof(T));
}

Для всего остального есть memcpy().

Answer 2

Несмотря на то, что использование reinterpret_cast в большинстве случаев приводит к неопределенному поведению, библиотеки могут использовать его в своих реализациях, тестируя их для конкретных компиляторов. Для пользователя библиотек поведение уже не будет неопределённым, т.к. оно проверено и документировано, но ему придётся учитывать список поддерживаемых компиляторов. Иногда это единственный способ разработки кросплатформенной библиотеки.

Кроме того, всё еще есть случаи, когда приходится жертвовать переносимостью для достижения других целей (в частности, это актуально для микроконтроллеров).

READ ALSO
Редактирование шаблона в админке (YII2)

Редактирование шаблона в админке (YII2)

Где можно отредактировать вид таблицы в админке? В исходнике страницы указывается такой путь:

328
Исправить простую ошибку в JS/jQuery

Исправить простую ошибку в JS/jQuery

Как сделать так, чтоб в class записалось уже готовое свойство:

267
Как в одном запросе получить количество записей по параметрам из разных таблиц?

Как в одном запросе получить количество записей по параметрам из разных таблиц?

У меня есть 3 таблицыПервая таблица это: packs_global_cats В ней есть 3 глобальные категории

271
Как растягивать GridBagLayout как это делает BorderLayout и GridLayout?

Как растягивать GridBagLayout как это делает BorderLayout и GridLayout?

Есть таблица из связки JLabel/JButton и JText, с помощью Grid'a задал им нужные пропорции, но при растяжении окна размеры (масштаб) компонентов не меняетсяКак...

318