В C++ существует оператор reinterpret_cast
, смысл которого заключается в приведении между типами, несовместимыми друг с другом.
Однако подобные преобразования нарушают strict aliasing rule, что провоцирует неопределённое поведение. Те же преобразования, которые этого правила не нарушают, укладываются в const_cast
, static_cast
и dynamic_cast
.
В чём же тогда заключается смысл существования данного оператора, если его использование нарушает стандарт?
Существует ровно один вид преобразования между несовместимыми типами, не нарушающий 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()
.
Несмотря на то, что использование reinterpret_cast
в большинстве случаев приводит к неопределенному поведению, библиотеки могут использовать его в своих реализациях, тестируя их для конкретных компиляторов. Для пользователя библиотек поведение уже не будет неопределённым, т.к. оно проверено и документировано, но ему придётся учитывать список поддерживаемых компиляторов. Иногда это единственный способ разработки кросплатформенной библиотеки.
Кроме того, всё еще есть случаи, когда приходится жертвовать переносимостью для достижения других целей (в частности, это актуально для микроконтроллеров).
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Где можно отредактировать вид таблицы в админке? В исходнике страницы указывается такой путь:
Как сделать так, чтоб в class записалось уже готовое свойство:
У меня есть 3 таблицыПервая таблица это: packs_global_cats В ней есть 3 глобальные категории
Есть таблица из связки JLabel/JButton и JText, с помощью Grid'a задал им нужные пропорции, но при растяжении окна размеры (масштаб) компонентов не меняетсяКак...