https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85717
--- Comment #4 from claudio daffra <daffra.claudio at gmail dot com> --- I expect that the compiler regardless of the location of the types always gives me the same result, error message or warning indeed : # case integer before double : union { uint64_t integer ; double real; } ; gives me error, about narrowing conversion : prova.cpp:32:5: error: narrowing conversion of '3.3999999999999999e+0' from 'double' to 'uint64_t {aka long long unsigned int}' inside { } [-Wnarrowing] t1 = { 1 ,"a",3.4 } ; ^ # case double before integer, compile without warning or error me : union { double real; uint64_t integer ; } ; and about output gives me undefined behavior about integer t1 = { 1 ,"a",3.4 } ; std::cout << t1.real << "\n" ; t1 = { 1 ,"a",2 } ; std::cout << t1.integer << "\n" ; C:\prj>x.exe 6.6 3 3.4 4611686018427387904 however if it is a normal behavior of c++ or compiler, close it.