Re[5]: Требуются пояснения
От: B0FEE664  
Дата: 11.12.24 17:23
Оценка:
Здравствуйте, rg45, Вы писали:

BFE>>
BFE>>UMBA_ENUM_CLASS_IMPLEMENT_UNDERLYING_TYPE_RELATION_OPERATORS(CEEE)
BFE>>CEEE::zero < EEE::one;
BFE>>

BFE>>

R>Ну так у него это задано явно и намеренно. А в твоем подходе элементы разных перечислений сходу являются величинами совместимых типов, над которыми можно выполнять любые арифметические операции. Теряется типовая надежность.


Нет при таком подходе никакой типовой надёжности! Вот такое скомпилируется:
UMBA_ENUM_CLASS_IMPLEMENT_UNDERLYING_TYPE_ARITHMETIC_OPERATORS(CEEE)
    CEEE x = CEEE::two + 1;

при том, что в CEEE:
enum class CEEE
{
    zero,
    one,
    two
};

нет значения three. Значит в x лежит невалидное значение. (Помимо формального UB см. ниже) это означает, что в коде нигде нельзя положиться на пришедшее значение CEEE. CEEE перестало отличаться от int. Считать, что x имеет тип CEEE — это обманывать себя и читателя.

BFE>>PS А вы в курсе про потенциальное теоретическое UB при выходе за пределы диапазона значений enum class?

R>А эту проблему можно отправить отдыхать, явным заданием подходящего underlying type. А если к тому же в качестве допустимых операций рассматриваются только сравнение и битовые операции, то переполнению и вовсе неоткуда взяться.
Ээээ.... Вообще-то речь не про переполнение.
Если бы CEEE был объявлен как enum class CEEE : int... то тогда — да, UB нет, а вот без задания базового типа компилятор может полагаться на то, что есть только три значения. Да, я понимаю, что сами писатели стандарта пишут одно, а подразумевают другое, но формально это неопределённое поведение.
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.