union type { int x; long y; } var;
var.x = 1;
std::cout << var.y;
union type { int x; long y; } var;
var.x = 1;
std::cout << bit_cast<long>(var.x);
int32_t x; reinterpret_cast<float*>(&x);
Почему? Потому что это не типобезопасно. Поэтому в стандарт ввели bit_cast. Когда вместо приведения, ты просто копируешь память. Внутри оно устроено как-то так template<class To, class From>
To bit_cast(const From& src) noexcept
{
static_assert(std::is_trivially_constructible_v<To>,
"This implementation additionally requires "
"destination type to be trivially constructible");
To dst;
std::memcpy(&dst, &src, sizeof(To));
return dst;
}
int n1 = dev.GetSpeed();
int result = dev.SetSpeed(arg);
int fun = dev.GetSpeed() + arg * dev.GetSome();
int n1 = dev.speed;
dev.speed = arg;
int fun = dev.speed + arg * dev.some;
template<class T>
class Foo
{
T at(int sz); //Первый вариант
template<class U>
U at(U sz); //Второй вариант
}
int b = m.at<int>(5);
C::value_type
нужно дописывать typename
как тут.template<class C>
class property : public C
{
public:
property& operator= (typename C::type arg)
{
this->Setter(arg);
return *this;
}
operator typename C::type()
{
return this->Getter();
}
};
Из чего следует что в целом reinterpret_cast не нужен ни для чего кроме конвертаций указатель<->число и каста указателей в char*. В остальном же это UB + какие-то компиляторы позволяют безопасно кастить в void* и приводить указатели к другому типу, но тут уже начинаются приколы с псевдонимами типов, который используется оптимизатором + если использовать преобразованные указатели\ссылки то опять всё падает в UB.
Мир С++ полон жути(