0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83

Поясните про типизированный enum

16.10.2017, 19:45. Показов 4274. Ответов 9

Студворк — интернет-сервис помощи студентам
В документации указано что я могу писать (С++11) что-то типа такого:
C++
1
enum : type { const1 = constexpr, const2 = constexpr };
Как я понял, тип можно указать любой, но когда я написал что-то типа такого:

C++
1
enum class MyClasses : MyClass { class1 = MyClass(params) };
Ничего не заработало, в сообщении ошибки сказано "type 'int' is not compatible with 'MyClass'"

Так что, получается что указывать я могу только числовые типы, чтоб моё перечисление было как {1, 2, 3}?
И в чём тогда смысл этих типов??
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.10.2017, 19:45
Ответы с готовыми решениями:

Поясните, пожалуйста, несколько моментов про выделение памяти
Ребят объясните: int* a; a = new a(1); в первой строке указатель ссылается на какуюто память, те она уже выделена и занять ее ни кто...

Enum == int !=enum?
enum Flags{ Flag1 = 1, Flag2 = 2}; int main() { Flags a = Flag1, b = Flag2; a = a | b; } error C2440: =: невозможно...

Поясните про 1уа
Вот меня что интересует: если платно участвуешь, без размещения помойки на своем сайте, ссылки действительны только, пока платишь? А...

9
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
16.10.2017, 19:53
там можно встроенные типа задавать. возможно только интегральные из них.
смысл хорошо описан у мейерса в его последней книге о современном с++. рекомендую найти и почитать.
Скотт Мейерс | Эффективный и современный С++: 42 рекомендации по использованию C++11 и C++14
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
16.10.2017, 20:05
Любой enum - это число (если тип не указан, компилятор может поставить char или short для экономии, это иногда приводит к тяжелым багам).
enum class (enum struct) - это:
- если не указан тип, всегда int;
- к элементам перечня можно добраться исключительно через имя перечня и ::, что способствует читаемости кода (вроде такого: если у нас два игрока, red и blue, и в то же время их цвета - red и blue, то цвета надо называть Color::red и Color::blue).
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
17.10.2017, 10:38
Цитата Сообщение от Azazel-San Посмотреть сообщение
(если тип не указан, компилятор может поставить char или short для экономии, это иногда приводит к тяжелым багам)
бред какой-то,
http://en.cppreference.com/w/cpp/language/enum
Values of unscoped enumeration type are implicitly-convertible to integral types. If the underlying type is not fixed, the value is convertible to the first type from the following list able to hold their entire value range: int, unsigned int, long, unsigned long, long long, or unsigned long long. If the underlying type is fixed, the values can be converted to their promoted underlying type.
то бишь, компилятор на это не имеет права.
имеет только на увеличение кол-ва бит для того, чтобы число влезло, если тип не указан.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <limits>
 
constexpr auto val = static_cast<long long>(std::numeric_limits<int>::max()) + 1;
 
enum Foo { x = val };
 
int main()
{
    auto f = Foo::x;
    std::cout << std::numeric_limits<int>::max() << " : " << f << "\n";
}
Цитата Сообщение от DrankUser Посмотреть сообщение
И в чём тогда смысл этих типов?
в том, что они автоматом в числа не конвертируются, как минимум.

Добавлено через 15 секунд
Цитата Сообщение от Azazel-San Посмотреть сообщение
(если тип не указан, компилятор может поставить char или short для экономии, это иногда приводит к тяжелым багам)
бред какой-то,
http://en.cppreference.com/w/cpp/language/enum
Values of unscoped enumeration type are implicitly-convertible to integral types. If the underlying type is not fixed, the value is convertible to the first type from the following list able to hold their entire value range: int, unsigned int, long, unsigned long, long long, or unsigned long long. If the underlying type is fixed, the values can be converted to their promoted underlying type.
то бишь, компилятор на это не имеет права.
имеет только на увеличение кол-ва бит для того, чтобы число влезло, если тип не указан.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <limits>
 
constexpr auto val = static_cast<long long>(std::numeric_limits<int>::max()) + 1;
 
enum Foo { x = val };
 
int main()
{
    auto f = Foo::x;
    std::cout << std::numeric_limits<int>::max() << " : " << f << "\n";
}
Цитата Сообщение от DrankUser Посмотреть сообщение
И в чём тогда смысл этих типов?
в том, что они автоматом в числа не конвертируются, как минимум.
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
18.10.2017, 02:47
Цитата Сообщение от GbaLog- Посмотреть сообщение
бред какой-то,
Вполне правду говорит. Из Стандарта:
Цитата Сообщение от 7.2 Enumeration declarations
5. Each enumeration defines a type that is different from all other types. Each enumeration also has an underlying type. The underlying type can be explicitly specified using an enum-base. For a scoped enumeration type, the underlying type is int if it is not explicitly specified. In both of these cases, the underlying type is said to be fixed...
Цитата Сообщение от 7.2 Enumeration declarations
7. For an enumeration whose underlying type is not fixed, the underlying type is an integral type that can represent all the enumerator values defined in the enumeration. If no integral type can represent all the enumerator values, the enumeration is ill-formed. It is implementation-defined which integral type is used as the underlying type except that the underlying type shall not be larger than int unless the value of an enumerator cannot fit in an int or unsigned int. If the enumerator-list is empty, the underlying type is as if the enumeration had a single enumerator with value 0.
( Жирным выделил я )

Добавлено через 2 минуты
Цитата Сообщение от GbaLog- Посмотреть сообщение
Values of unscoped enumeration type are implicitly-convertible to integral types. If the underlying type is not fixed, the value is convertible to the first type from the following list able to hold their entire value range: int, unsigned int, long, unsigned long, long long, or unsigned long long. If the underlying type is fixed, the values can be converted to their promoted underlying type.
Здесь речь идет о convertible, не о underlying type.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
18.10.2017, 05:54
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Вполне правду говорит.
ок.
но, тем не менее, ни один популярный компилятор не реализовал underlying type меньше int'a.
хотя всё равно непонятно, как это может привести к хоть каким-то багам...
как вообще реализация может полагаться на underlying type enum'а?
есть, конечно, std::underlying_type, но это вообще шаблон для метапрограммирования...
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
18.10.2017, 07:17
Цитата Сообщение от GbaLog- Посмотреть сообщение
но, тем не менее, ни один популярный компилятор не реализовал underlying type меньше int'a.
Согласен.

Цитата Сообщение от GbaLog- Посмотреть сообщение
хотя всё равно непонятно, как это может привести к хоть каким-то багам...
Наверное, вот: ( это я с головы взял, особо не верь, но выглядит правдоподобно )
C++
1
2
3
4
{
  enum { VALUE };
  VALUE >> sizeof ( int ) * CHAR_BIT - 1;  // unspecified behavior
}
Цитата Сообщение от GbaLog- Посмотреть сообщение
как вообще реализация может полагаться на underlying type enum'а?
Это не понял.

Добавлено через 6 минут
GbaLog-, кстати, пока писал, вот что пришло в голову: ( теория )
1. Если писать вот так:
C++
1
enum { VALUE1, VALUE2, ... };
Тогда, наверное, действует это правило:
It is implementation-defined which integral type is used as the underlying type except that the underlying type shall not be larger than int unless the value of an enumerator cannot fit in an int or unsigned int.
2. Если писать так:
C++
1
enum { VALUE1 = 0, VALUE2 = 1, ... };
Тогда, возможно, тип енума и правда будет int, ибо компилятор посмотрит на литералы 0, 1 ( а это int по-умолчанию ), и сделает int как underlying type.

Надо будет потом перечитать раздел про енум, возможно, там что-то есть об этом.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
18.10.2017, 08:26
Цитата Сообщение от Captain Maxee Посмотреть сообщение
1. Если писать вот так:
это правило действует всегда, когда не задан тип и это не enum class/struct.
ну, это если я правильно понял, что значит scoped enumeration, кстати, 7.2/5 как раз об них, то бишь там всегда int.
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Наверное, вот
так почему бы не sizeof(VALUE)?
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Это не понял.
вопрос состоит в том, как код может вообще пологаться на тип, который использует enum(underlying type)?
а вообще, если это важно, то для подобного есть метафункция, вычисляющая этот тип(std::underlying_type).

Добавлено через 1 минуту
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Тогда, возможно, тип енума и правда будет int, ибо компилятор посмотрит на литералы 0, 1 ( а это int по-умолчанию ), и сделает int как underlying type.
да хоть 'a' туда вставь, будет int/unsigned int. во всяком случае у gcc, clang и vc++.
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
18.10.2017, 08:59
Цитата Сообщение от GbaLog-
вопрос состоит в том, как код может вообще пологаться на тип, который использует enum(underlying type)?
Ну, вдруг, кому-то нужно, чтобы переменная типа енума занимала int8_t
Не знаю что ответить. Не до конца понимаю, извиняй

Не по теме:

Как ты цитируешь вместе со всеми тегами?
Или ты используешь «мультицитирование», заходишь в расширенный режим, и удаляешь лишнее?

0
18.10.2017, 09:51

Не по теме:

Цитата Сообщение от Captain Maxee Посмотреть сообщение
Как ты цитируешь вместе со всеми тегами?
ручками, ручками. :)

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.10.2017, 09:51
Помогаю со студенческими работами здесь

Поясните про socket
Хочу спросить вот одну вещь. Я играю в одну мобильную онлайн игру с компьютера через эмулятор. Так вот. При юзании игры сниффером у меня...

Поясните про исключения
Здравствуйте! Создал класс Logs, который в файл скидывает сообщение об ошибке. Есть служба, которая в цикле обрабатывает данные. Так вот,...

Поясните про GitHub
Кто-нибудь может послать меня куда надо(:stop:), чтоб про GitHub почитать (как пользоваться и т.д.) на русском?:) Вроде установил...

Поясните про эти функции
Всем привет. Хотелось бы чтобы кто нибудь обьяснил , откуда и почему в этой функции присутствует ноль (0)? Читал документацию, но...

Я новичек поясните про ВЛАНЫ
Добрый день! Я новичек и только учусь работать, помогите мне разобраться с ВЛАНАМИ. Поставили задачу следующую: Есть 2 серверные в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru