Можно ли переобъявить значения перечисления?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Можно ли переобъявить значения перечисления?

Сообщение Anonymous »

Руководство по программированию на C++, Enum.3: Предпочитайте перечисления классов «простым» перечислениям, содержит следующий пример:

Код: Выделить всё

void Print_color(int color);

enum Web_color { red = 0xFF0000, green = 0x00FF00, blue = 0x0000FF };
enum Product_info { red = 0, purple = 1, blue = 2 };

Web_color webby = Web_color::blue;

// Clearly at least one of these calls is buggy.
Print_color(webby);
Print_color(Product_info::blue);
Однако этот пример не компилируется (см. https://godbolt.org/z/vsYTKPv8x). Я понимаю, что перечисление с ограниченной областью не будет загрязнять глобальное пространство имен и не будет так легко конвертироваться в целые числа, но этот пример выглядит так, как будто он пытается продемонстрировать какую-то проблему повторного объявления для красного и синего?
Это также связано с соответствующей записью в Руководстве по кодированию AUTOSAR C++, где Правило A7-2-3 гласит: «Перечисления должны быть объявлены как классы перечислений с ограниченной областью действия». с обоснованием:

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

Первый оператор сложно разобрать (что то же самое). идентификатор?), но там упоминается «переобъявление», так в чем здесь основная проблема (может ли это быть связано с переменной Redeclare внутри перечисления, но первая строка должна быть «Если перечисление без области видимости объявлено в классе глобальной области»)

Подробнее здесь: https://stackoverflow.com/questions/798 ... redeclared
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»