Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 2 / 3
Регистрация: 29.01.2017
Сообщений: 83

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

16.10.2017, 19:45. Показов 4258. Ответов 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru