Здравствуйте, 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 нет, а вот без задания базового типа компилятор может полагаться на то, что есть только три значения. Да, я понимаю, что сами писатели стандарта пишут одно, а подразумевают другое, но формально это неопределённое поведение.