Для того, кто никогда не писал ни одной строки на C ++ 11 и у кого на данный момент нет возможности программировать на C ++ 11, вы можете в одном коротком абзаце сказать:
Что такое «enum class» и зачем он нам нужен?
enum class
называется Перечисление в области. Это предотвращает загрязнение пространства имен, в котором появляется перечисление с именами перечислителей.
В C ++ 03 вы могли бы эффективно сделать то же самое, поставив enum
внутри выделенного class
, Возможно, это источник синтаксиса, который немного сбивает с толку.
Другое отличие состоит в том, что перечислители такого типа не преобразуются неявно в int
(static_cast<int>
необходимо). Это может быть редко необходимый но это безопасно перегрузить функцию, принимая int
спор с одним взятием enum
тип. Вы можете быть уверены, что int
не будет вызван случайно. Или вы можете определить псевдо-интегральные типы с выделенным operator
функции, и убедитесь, что встроенные операторы не будут мешать.
Немного раздражает, что эти два несвязанных различия находятся в одном пакете, и что вы не можете получить незаданной перечисление без неявного преобразования, но обычно оба изменения являются хорошими вещами и enum class
является хорошей практикой по умолчанию в C ++ 11.
РЕДАКТИРОВАТЬ: Перечисление области видимости определяется так:
enum class duck { huey, dewey, louie };
и должен использоваться с оператором разрешения области ::
как это:
duck culprit = duck::huey; // or "auto culprit" to avoid redundancy
Обратите внимание, что ::
Оператор также работает с перечислениями C ++ 03 с незаданной областью, поэтому вторая строка выше будет работать, даже если первая отсутствует class
,
Это может быть чрезмерной детализацией, но class
не входит в уточненный тип Спецификатор если вперед объявить перечислимый тип, как в
void quack( enum duck whom ); // not "enum class"
Тем не менее, есть новая конструкция в C ++ 11, непрозрачное-перечисление декларация, который включает в себя class
Ключевое слово и определяет полный тип.
enum duck; // duck is declared as incomplete type
enum class duck; // duck is now complete type; underlying type defaults to int
Ключевое слово struct
можно заменить class
без семантической разницы.
По отношению к пункту 1, размер хранилища enum
s изменяется до C ++ 11 в зависимости от наибольшего значения, присвоенного перечислению. Обычно это не так важно, но когда нужно, приходится прибегать к уродливым хакерам, чтобы увеличить размер.
Что касается точки 3, в C ++ 11 enum
не являются неявно конвертируемыми или сопоставимыми с int
с или другой enum
Типы: полезно, чтобы избежать головной боли перегрузки функций и других ошибок неявного преобразования.
Лично я использовал его в протоколе обмена сообщениями на основе протокола tcp: многие поля представляли собой перечислимые значения, необходимые для кодирования только внутри одного байта, чтобы уважать интерфейс обмена сообщениями ..
Все мои перечисления были просто определены следующим образом:
enum class EnumFieldA : unsigned char { eValProperty1, eValProperty2};
enum class EnumFieldB : unsigned char { eValProperty1, eValProperty2, eValProperty3};
enum class EnumFieldC : unsigned char { eValProperty1, eValProperty2, eValProperty3, eValProperty4};
...
Есть также много подробных ответов в этот ТАК вопрос.
Сначала я был озадачен вашим вопросом, но я думаю, что вы хотите знать разницу между enum-ом c ++ и c ++ 11. Насколько я могу понять, в последующем вы строго указали перечисления, что позволяет вам охватить их. Я думаю этот хорошо объясняет CHEERS