Страницы

Поиск по вопросам

вторник, 27 ноября 2018 г.

Каст к enum class

Законен ли каст значения типа underlying type к типу моего enum class? Т.е. можно ли делать так?
enum class A : size_t { x = 0u, y = 1u, };
// main static_cast(0u);
Заметил интересную вещь: если пытаться кастовать значения, которые есть в перечислении (0u и 1u), то в дебаггере будут верные буквенные значения (x и y), а если пытаться скастовать не присутствующее там число, но всё ещё типа size_t, то никакой ошибки компиляции нет, но в дебаггере не показывается ни x, ни y, а просто это число, т.е. имеем сложнообнаружимый баг. Если каст законен, можно ли как-то контролировать правильность значений?


Ответ

Хранение в enum-объекте представимых, но неименованных значений, не является "багом" или "неправильным значением" с точки зрения общей функциональности enum-типов. Если согласно логике вашего кода это - баг, то вам придется контролировать это самостоятельно. Собственно для того в таких ситуациях и требуется явный каст, чтобы привлечь ваше внимание к потенциальной проблеме.
Кстати, единственным "нелегальным" значением, которое можно "протащить" в любой enum-объект без явного каста является как раз таки 0
enum class A : size_t { x = 1u, y = 2u, };
int main() { A a = A(); }

Комментариев нет:

Отправить комментарий