The first simple example:
#include <bit>
#include <cstdint>
#include <iomanip>
#include <iostream>
std::uint32_t badBits(const float value)
{
// const prevents writes, but reading a float through a uint32_t pointer
// still violates the strict-aliasing rule.
const auto* bits = reinterpret_cast<const std::uint32_t*>(&value);
return *bits; // Undefined behavior.
}
std::uint32_t goodBits(const float value)
{
// std::bit_cast copies the object representation without violating
// strict-aliasing or object-lifetime rules.
return std::bit_cast<std::uint32_t>(value);
}
int main()
{
constexpr float value = 1.0F;
std::cout << std::hex
<< "bad: 0x" << badBits(value) << '\n'
<< "good: 0x" << goodBits(value) << '\n';
}


