Size: a a a

cxx.Дискуссионная

2020 May 26

O

Ofee in cxx.Дискуссионная
Artöm Bakri Al-Sarmini
Он всегда есть, через std::underlying_type его можно получить
Я к тому, что где-то встречался с мнением, что каст к нему UB до тех пор, пока мы его явно не укажем для перечисления
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
Ofee
Я к тому, что где-то встречался с мнением, что каст к нему UB до тех пор, пока мы его явно не укажем для перечисления
Не видел такого
источник

O

Ofee in cxx.Дискуссионная
Artöm Bakri Al-Sarmini
Не видел такого
Да точно должно быть UB, не должен enum содержать элемента, не входящего в его перечисление, это же бред
источник

O

Ofee in cxx.Дискуссионная
Это разрешено именно если у нас есть нижележащий тип, объявленный явно — для всяких извращений
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
Ofee
Да точно должно быть UB, не должен enum содержать элемента, не входящего в его перечисление, это же бред
Как енамы сериализуются по-твоему?
источник

O

Ofee in cxx.Дискуссионная
Artöm Bakri Al-Sarmini
Как енамы сериализуются по-твоему?
Элемент, не входящий в перечисление. 1488 явно не входит в диапазон допустимых значений для Sex. Вот, будь это 0 или 1 — не было бы UB
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
Ofee
Элемент, не входящий в перечисление. 1488 явно не входит в диапазон допустимых значений для Sex. Вот, будь это 0 или 1 — не было бы UB
Каст 1488 в Sex не уб, если 1488 представимо типом std::underlying_type_t<Sex>
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
То есть уб, если там uint8_t
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
И не уб, если unsigned
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
http://eel.is/c++draft/enum#dcl.enum-8
> It is possible to define an enumeration that has values not defined by any of its enumerators.
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
Рядом правила выбора низлежащего типа
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
Artöm Bakri Al-Sarmini
То есть уб, если там uint8_t
Точнее не уб, по модулю 2 врапится и все
источник

O

Ofee in cxx.Дискуссионная
Что означает  самое начало — an enumeration whose underlying type is fixed...? Я не очень понял из стандарта

Да бред это. Должно быть UB.
Рядовой пользователь, видя enum Sex { FEMALE, MALE }
Не должен ожидать чего-то отличного, от перечисленных значений в своих case-метках
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
Ofee
Что означает  самое начало — an enumeration whose underlying type is fixed...? Я не очень понял из стандарта

Да бред это. Должно быть UB.
Рядовой пользователь, видя enum Sex { FEMALE, MALE }
Не должен ожидать чего-то отличного, от перечисленных значений в своих case-метках
Читай полностью параграф про енам, он небольшой
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
Ofee
Что означает  самое начало — an enumeration whose underlying type is fixed...? Я не очень понял из стандарта

Да бред это. Должно быть UB.
Рядовой пользователь, видя enum Sex { FEMALE, MALE }
Не должен ожидать чего-то отличного, от перечисленных значений в своих case-метках
Проверить на недопустимое по бизнес-логике значение он должен
источник

O

Ofee in cxx.Дискуссионная
Ofee
Что означает  самое начало — an enumeration whose underlying type is fixed...? Я не очень понял из стандарта

Да бред это. Должно быть UB.
Рядовой пользователь, видя enum Sex { FEMALE, MALE }
Не должен ожидать чего-то отличного, от перечисленных значений в своих case-метках
Даже компилятор варнит за default для такого перечисления, сейчас, ушёл читать
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
Ofee
Что означает  самое начало — an enumeration whose underlying type is fixed...? Я не очень понял из стандарта

Да бред это. Должно быть UB.
Рядовой пользователь, видя enum Sex { FEMALE, MALE }
Не должен ожидать чего-то отличного, от перечисленных значений в своих case-метках
Это кстати красиво бы решалось через контракты+рефлексию
[[assert: is_valid_enumerator(s)]]
void f(Sex s);

где is_valid_enumerator проверяет, что s одна из заданных констант енама
источник

O

Ofee in cxx.Дискуссионная
Artöm Bakri Al-Sarmini
Это кстати красиво бы решалось через контракты+рефлексию
[[assert: is_valid_enumerator(s)]]
void f(Sex s);

где is_valid_enumerator проверяет, что s одна из заданных констант енама
Я не понимаю, зачем вообще легализировать возможность создания таких значений?
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
Ofee
Что означает  самое начало — an enumeration whose underlying type is fixed...? Я не очень понял из стандарта

Да бред это. Должно быть UB.
Рядовой пользователь, видя enum Sex { FEMALE, MALE }
Не должен ожидать чего-то отличного, от перечисленных значений в своих case-метках
Этот инвариант не выразить синтаксически в текущей версии языка
источник

AB

Artöm Bakri Al-Sarmi... in cxx.Дискуссионная
Ofee
Я не понимаю, зачем вообще легализировать возможность создания таких значений?
Чтобы не плодить уб
источник