Читая цитату в этом ответе о строгом правиле псевдонимов, я вижу следующее для C ++ 11:
Если программа пытается получить доступ к сохраненному значению объекта через glvalue, отличный от одного из следующих типов, поведение не определено:
...
тип агрегата или объединения, который включает один из вышеупомянутых типов среди своих элементов или нестатических элементов данных (включая, рекурсивно, элемент или нестатический член данных субагрегата или содержащегося объединения),
...
Поэтому я понимаю, что следующий код не нарушает строгого правила псевдонима:
#include <iostream>
#include <cstdint>
#include <climits>
#include <limits>
struct PunnerToUInt32
{
std::uint32_t ui32;
float fl;
};
int main()
{
static_assert(std::numeric_limits<float>::is_iec559 &&
sizeof(float)==4 && CHAR_BIT==8,"Oops");
float x;
std::uint32_t* p_x_as_uint32=&reinterpret_cast<PunnerToUInt32*>(&x)->ui32;
*p_x_as_uint32=5;
std::cout << x << "\n";
}
Итак, строгое правило псевдонима выполнено. По какой-либо другой причине это все еще проявляет неопределенное поведение?
reinterpret_cast
, а это неchar*
, вы наблюдаете строгое нарушение псевдонима в 99,9% случаев (0,1% зарезервировано для случаев, когда указатель фактически не разыменовывается, а используется для другого приведения обратно к то, что разрешено). - person SergeyA   schedule 23.06.2016