Использование анонимных перечислений - PullRequest
62 голосов
/ 22 августа 2011

Какова цель анонимных enum объявлений, таких как:

enum { color = 1 };

Почему бы просто не объявить int color = 1?

Ответы [ 7 ]

80 голосов
/ 22 августа 2011

Это так называемый трюк enum для объявления целочисленной константы времени компиляции . Его преимущество заключается в том, что он гарантирует, что ни одна переменная не будет создана, и, следовательно, нет затрат времени выполнения. В большинстве случаев компиляторы не вводят издержки с целочисленными константами.

56 голосов
/ 22 августа 2011

Перечисления не занимают места и являются неизменяемыми.

Если бы вы использовали const int color = 1;, то вы бы решили проблему изменчивости, но если бы кто-то взял адрес color (const int* p = &color;), тогда для него пришлось бы выделить место. Это может не иметь большого значения, но если вы явно не хотите, чтобы человек могли взять адрес color, вы могли бы также предотвратить его.

Также при объявлении константного поля в классе оно должно быть static const (не верно для современного C ++) , и не все компиляторы поддерживают встроенную инициализацию статических константных членов.


Отказ от ответственности: Этот ответ не следует воспринимать как совет по использованию enum для всех числовых констант. Вы должны делать то, что вы (или ваши коровники) считаете более читабельным. В ответе просто перечислены некоторые причины, по которым может предпочитает использовать enum.

6 голосов
/ 22 августа 2011

Если это старый код, тогда enum мог использоваться для "взлома enum".

Вы можете узнать больше о "enum hack", например, по этой ссылке: enum hack

4 голосов
/ 22 августа 2011

Одно из применений этого - когда вы выполняете метапрограммирование шаблона, потому что объекты enum не являются lvalues, в то время как static const члены. Раньше это был обычный обходной путь для компиляторов, которые не позволяли инициализировать статические интегральные константы в определении класса. Это объясняется в другом вопросе .

4 голосов
/ 22 августа 2011
(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]

1 голос
/ 22 августа 2011

Когда вы используете
enum {color = 1}
вы не используете какую-либо память, это похоже на
#define color 1

Если вы объявляете переменную
int color=1 Тогда вы 'занимает память для значения, которое не подлежит изменению.

0 голосов
/ 08 сентября 2014

Я не вижу упоминания, другое применение - определить ваши константы.В настоящее время я работаю над кодом, который был написан с использованием Visual Studio 2005, и теперь он портирован на Android - G ++.В VS2005 вы могли иметь такой код enum MyOpts { OPT1 = 1 }; и использовать его как MyOpts :: OPT1 - и компилятор не жаловался на это, даже если он недействителен.g ++ сообщает о таком коде как об ошибке, поэтому одним из решений является использование анонимного перечисления следующим образом: struct MyOpts { enum {OPT1 =1}; };, и теперь оба компилятора счастливы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...