Я читал много QA о строгом псевдониме здесь, в Stack Overflow, но все они довольно распространены, и обсуждение всегда имеет тенденцию ссылаться на глубокие детали стандарта C ++, которые почти всегда трудно понять правильно. Особенно, когда стандартные вещи не говорят прямо, а описывают что-то мутно и непонятно. Итак, мой вопрос, вероятно, является возможным дублированием тонн QA здесь, но, пожалуйста, просто ответьте на конкретный вопрос:
Это правильный способ сделать "nonalias_cast"?:
template<class OUT, class IN>
inline auto nonalias_cast(IN *data) {
char *tmp = reinterpret_cast<char *>(data);
return reinterpret_cast<OUT>(tmp);
}
float f = 3.14;
unsigned *u = nonalias_cast<unsigned *>(&f);
*u = 0x3f800000;
// now f should be equal 1.0
Думаю, ответ нет. Но есть ли хороший обходной путь? Кроме отключения флага строгого сглаживания, конечно. Union также не является удобным вариантом, если только нет способа поместить хак union в тело функции nonalias_cast
. memcpy
здесь тоже не вариант - изменение данных должно быть синхронизировано.
Несбыточная мечта или ускользающая реальность?
ОБНОВЛЕНИЕ:
Хорошо, поскольку у нас есть отрицательный ответ на вопрос "возможно ли это?" вопрос, я хотел бы задать вам дополнительный вопрос, который меня беспокоит:
Как бы вы решили эту задачу? Я имею в виду, что есть масса практических задач, которые более-менее требуют подхода "поиграй с битами". Например, предположим, что вам нужно написать преобразователь с плавающей запятой IEEE-754, например этот . Меня больше волнует практическая сторона вопроса: как найти обходной путь для достижения цели? По крайней мере, "боль в @#$".
reinterpret_casts
изменять тип объекта. Скорее, существует только один тип объекта и очень ограниченное число других типов, которые можно использовать для его чтения. Вы не можете читать из объектаfloat
выражение, утверждающее, что этот объект являетсяunsigned
(не уверен в формировании этого указателя, он может быть смещен). - person dyp   schedule 09.10.2017union
идей: это также не может работать, так как UB читатьunion
члена, отличного от того, который был назначен последним. - person Baum mit Augen   schedule 09.10.2017memcpy
. - person Ruslan   schedule 12.03.2018