Законен ли каст значения типа 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();
}
Комментариев нет:
Отправить комментарий