ошибка reinterpret_cast для enum

Почему я не могу использовать оператор reinterpret_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);
}
 R. Martinho Fernandes01 сент. 2012 г., 16:28
Почему это будет действительным? Как вы думаете, для чего reinterpret_cast?
 FrozenHeart01 сент. 2012 г., 16:30
Я думаю, что reinterpret_cast можно использовать для всех типов приведений, поскольку он заставляет любой тип приводить к другому типу со всеми побочными эффектами этого преобразования.
 Joel Rondeau01 сент. 2012 г., 16:31
Вот хорошее объяснение:stackoverflow.com/questions/573294/when-to-use-reinterpret-cast
 Travis Gockel01 сент. 2012 г., 16:28
static_cast правильная операция здесь.

Ответы на вопрос(2)

Поскольку обычный перечисляемый базовый типintнечегоreinterpret, Статическое приведение является правильным преобразованием для этого случая.

 01 сент. 2012 г., 16:44
@ Дрю Дорманн Я знаю, но в большинстве случаев в будет.
 01 сент. 2012 г., 16:38
@Rost, это не правда. Стандарт гарантирует, что базовый тип emum являетсяintegral type, но не обязательноint.
 01 сент. 2012 г., 17:31
Если & quot; нечего интерпретировать & quot; было что-то делать с правильностью, то это не получитсяint x = 0; int* p = reinterpret_cast<int*>(&x);
 01 сент. 2012 г., 16:40
@tenfour Ну, это было добавлено в C ++ 11. Не знаю причину. Возможно разрешить некоторые трюки с шаблонами?
 01 сент. 2012 г., 17:50
Причинаenum-До-int не может быть сделано черезreinterpret_cast не имеет ничего общего с базовым типомenum, Если бы это былоenum Foo : uint64_t { bar, baz }, reinterpret_cast<int> все еще не будет разрешено.
Решение Вопроса

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.

Это распространенное заблуждение. Преобразования, которые могут быть выполнены сreinterpret_cast перечислены явно в 5.2.10 стандарта.int-До-enum а такжеenum-До-int конверсий нет в списке:

Pointer to integral type, so long as the integer is large enough to hold it nullptr_t to integer integral type or enum to pointer function pointer to another function pointer of different type object pointer to another object pointer of different type nullptr_t to other pointer type pointer-to-member of T1 to a different pointer-to-member of T2 in cases where both T1 and T2 are objects or functions

reinterpret_cast обычно используется, чтобы сообщить компилятору: эй, я знаю, вы думаете, что эта область памятиTно я бы хотел, чтобы вы истолковали это какU (гдеT а такжеU несвязанные типы).

Также стоит отметить, чтоreinterpret_cast может влиять на биты:

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 ]

Приведение в стиле C всегда работает, потому что оно включаетstatic_cast в своих попытках.

Ваш ответ на вопрос