Использование анонимных перечислений
какова цель анонима 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предложите точно такую же концепцию; это вопрос выбора. Что касается распространенного мнения, чтоenums экономит место, 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}; };, и теперь оба компилятора счастливы.