Why i can't use reinterpret_cast operator for such a cast?
enum Foo { bar, baz };
void foo(Foo)
{
}
int main()
{
// foo(0); // error: invalid conversion from 'int' to 'Foo'
// foo(reinterpret_cast<Foo>(0)); // error: invalid cast from type 'int' to type 'Foo'
foo(static_cast<Foo>(0));
foo((Foo)0);
}
reinterpret_cast is a type of casting operator used in C++. It is used to convert a pointer of some data type into a pointer of another data type, even if the data types before and after conversion are different. It does not check if the pointer type and data pointed by the pointer is same or not.
The result of a reinterpret_cast cannot safely be used for anything other than being cast back to its original type. Other uses are, at best, nonportable. The reinterpret_cast operator cannot cast away the const , volatile , or __unaligned attributes.
static_cast only allows conversions like int to float or base class pointer to derived class pointer. reinterpret_cast allows anything, that's usually a dangerous thing and normally reinterpret_cast is rarely used, tipically to convert pointers to/from integers or to allow some kind of low level memory manipulation.
None of the casts happen at compile time. You only have the data at runtime, in general.
I think that
reinterpret_cast
can be use for all types of casts, because it's force any type casts to another type with all side-effects of this conversion.
That is a common misconception. Conversions which can be performed with reinterpret_cast
are listed explicitly in 5.2.10 of the standard. int
-to-enum
and enum
-to-int
conversions are not in the list:
nullptr_t
to integerenum
to pointernullptr_t
to other pointer typeT1
to a different pointer-to-member of T2
in cases where both T1
and T2
are objects or functionsreinterpret_cast
is typically used to tell the compiler: Hey, I know you think this region of memory is a T
, but I'd like you to interpret it as a U
(where T
and U
are unrelated types).
It is also worth noting that reinterpret_cast
can have effects on the bits:
5.2.10.3
[ Note: The mapping performed by reinterpret_cast might, or might not, produce a representation dif- ferent from the original value. — end note ]
The C-style cast always works, because it included static_cast
in its attempts.
Because regular enum underlying type is int
, there is nothing to reinterpret. Static cast is proper conversion for this case.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With