Вопрос по enums, c++, static-cast – ошибка reinterpret_cast для enum

10

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

Ваш Ответ

2   ответа
18

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 в своих попытках.

4

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

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

Похожие вопросы