Спецификация, что перечисления C ++ являются конструируемыми по умолчанию? - PullRequest
0 голосов
/ 27 января 2019

Типы перечисления C ++ представляются «конструируемыми по умолчанию»:

enum UE { a=1, b, c };
enum class SE { a=1, b, c };

int main() {
    UE ue;
    SE se;
}

Как это можно объяснить из стандарта?

Я имею в виду - допустим, мы хотели изменить стандарт насделать так, чтобы они не были конструктивными по умолчанию.Какие пункты изменится?

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Здесь имеется черновая спецификация: http://www.open -std.org / jtc1 / sc22 / wg21 / docs / paper / 2018 / n4778.pdf

См. Раздел 9.6, Перечислениеобъявлений.

Я думаю, что вы, возможно, пришли из Java, в которой перечисления являются классами.В C ++ перечисляемые значения являются просто целочисленными константами.Тип константы обычно int, хотя он может быть явно определен.

Поскольку перечисление является просто int, когда вы объявляете его без инициализатора, не используется конструктор по умолчанию;вы просто получаете неинициализированный int.

0 голосов
/ 27 января 2019

Не позволяйте class в enum class сбить вас с толку: он по-прежнему считается неклассным типом.Синтаксис для enoped enums как раз случайно использует ключевое слово class, чтобы не добавлять еще одно зарезервированное слово в язык.

0 голосов
/ 27 января 2019

Это все в [dcl.init] / 7 :

По умолчанию инициализация объекта типа T означает:

  • Если T является (возможно, cv-квалифицированным) типом класса, рассматриваются конструкторы.Применимые конструкторы перечислены ([over.match.ctor]), и наилучший для инициализатора () выбирается с помощью разрешения перегрузки.Выбранный таким образом конструктор вызывается с пустым списком аргументов для инициализации объекта.

  • Если T является типом массива, каждый элемент инициализируется по умолчанию.

  • В противном случае инициализация не выполняется.

UE и SE соответствуют третьему пункту, как базовые типы.Таким образом, initializaiton - это просто запрет, и у них остается неопределенное значение.

Это также список маркеров, с которым вам нужно разобраться в первую очередь, чтобы сделать перечисления не инициализируемыми по умолчанию.

...