Есть ли у этого кастинга проблемы?
номер
Если этот кастинг имеет смысл, то почему? Исходя из моего понимания, Options определяет только две переменные, как значение 0x03 имеет смысл?
Тип перечисления Options
имеет два именованных перечислителя, но диапазон значений, которые он представляет, достаточно велик, чтобы его можно было использовать в качестве битового поля, содержащего каждый из перечислителей.
Вкратце: да, допустимо и четко определено использование перечисления для битового поля, подобного этому.
Как указано в комментариях к этому ответу, формальный язык, разрешающий это, можно найти в Стандарте C ++ (C ++ 03 7.2 / 6):
Для перечисления, где e min - наименьший перечислитель, а e max - наибольший, значения перечисления значения базового типа в диапазоне b min до b max , где b min и b max являются, соответственно, наименьшим и наибольшим значениями наименьшего битового поля, которое может хранить e min и e max .
Можно определить перечисление, значения которого не определены ни одним из перечислителей.
Есть некоторые споры относительно того, является ли это хорошим стилем. Конечно, можно утверждать, что часто предполагается, что объект перечисления может хранить только один из своих перечислителей, поэтому подобный код может быть запутанным и подверженным ошибкам.
С другой стороны, я бы сказал, что обычно вполне очевидно, когда перечисление предназначено для использования в качестве битового поля. Обычно такое перечисление именуется суффиксом Options
или Flags
или чем-то подобным. Аналогично, если каждый из перечислителей имеет заданное значение, которое является явно одним установленным битом, это перечисление, вероятно, предназначено для использования в качестве битового поля.