Использование анонимных перечислений
какова цель анонима enum
объявления, такие как:
enum { color = 1 };
почему бы просто не объявить int color = 1
?
7 ответов:
перечисления не занимают никакого места и являются неизменяемыми.
если вы используете
const int color = 1;
тогда вы бы решить проблему изменчивости, но если кто-то взял адресcolor
(const int* p = &color;
), то место для него должно быть выделено. Это не может быть большим делом, но если вы явно хочу люди, чтобы иметь возможность взять адресcolor
вы могли бы также предотвратить его.также при объявлении констант поля в классе, то он должен быть
static const
(не верно для современного C++) и не все компиляторы поддерживают встроенную инициализацию статических членов const.
отказ от ответственности: этот ответ не следует воспринимать как совет использовать
enum
для всех числовых констант. Вы должны делать то, что вы (или ваши коллеги) считаете более читабельным. Ответ просто перечисляет некоторые причины один может предпочитаю использоватьenum
.
Это так называемый Трюк перечисления для объявление целочисленной константы времени компиляции. Его преимущество заключается в том, что он гарантирует, что никакая переменная не создается, и поэтому нет накладных расходов во время выполнения. Большинство компиляторов не вводят никаких накладных расходов с целочисленными константами в любом случае.
Если это старый код, то перечисление может быть использовано для "enum hack".
вы можете узнать больше о "enum hack", например, по этой ссылке: перечисление hack
(1) int color = 1;
color
переменчива (случайно).(2) enum { color = 1 };
color
изменить нельзя.другой вариант для
enum
естьconst int color = 1; // 'color' is unmutable
и
enum
иconst int
предложите точно такую же концепцию; это вопрос выбора. Что касается распространенного мнения, чтоenum
s экономит место, IMO нет ограничений памяти, связанных с этим, компилятор достаточно умен, чтобы оптимизироватьconst int
при необходимости.[Примечание: Если кто-то пытается использовать
const_cast<>
наconst int
; это приведет к неопределенному поведению (что плохо). Однако то же самое невозможно дляenum
. Так что мой личный фаворитenum
]
одно использование этого - когда вы делаете метапрограммирование шаблона, потому что объекты enum не являются lvalues, в то время как
static const
членов. Это также было распространенным обходным путем для компиляторов, которые не позволяли инициализировать статические интегральные константы в определении класса. Это объясняется в еще вопрос.
при использовании
enum {color = 1}
вы не используете никакой памяти это как#define color 1
Если вы объявите переменную
int color=1
Тогда вы занимаете память для значения, которое не должно быть изменено.
Я не вижу, чтобы это упоминалось, другое использование-это охват ваших констант. В настоящее время я работаю над кодом, который был написан с помощью Visual Studio 2005, и теперь он портирован на android - g++. В VS2005 вы могли бы иметь такой код
enum MyOpts { OPT1 = 1 };
и использовать его как MyOpts:: OPT1 - и компилятор не жаловался на это, даже если это не является действительным. g++ сообщает такой код как ошибка, поэтому одним из решений является использование анонимного перечисления следующим образом:struct MyOpts { enum {OPT1 =1}; };
, и теперь оба компилятора счастливы.