Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>>>Ну коряво же.
BFE>>Почему?
ЕМ>Потому, что enum создает группу идентификаторов, объединенных общей идеей, а следовательно — областью видимости, пусть и неявной. Никто ж не создает {One, Two, Three}.
И для этого они лежат в namespace.
ЕМ> Почему в обсуждаемом примере все идентификаторы начинаются на E? 
Предполагаю, что это сокращение от слова ERROR.
BFE>>Что делать, если в двух библиотеках совпадают названия (но не элементы) у enum class?
ЕМ>То же самое, как если совпадают имена классов, глобальных переменных, функций. Почему enum должен выбиваться из этой схемы?
Вот если их поместить в отдельный namespace, то они и не будут выбиваться из схемы (раз уж изначально это не было сделано)
BFE>>Вообще-то в основе создания констант лежит #define
ЕМ>Вообще-то это не "константы", а "макроопределения". Это делалось (и посейчас нередко делается) исключительно от нехватки языковых средств.
Согласен. Но это никак не отменяет, что использовать #define для констант уместнее, чем enum.
BFE>>использовать SFINAE — грех?
ЕМ>Конечно, использовать SFINAE для выбора наиболее общего варианта шаблона — не грех, оно для этого и создавалось. И даже использовать SFINAE в сочетании с трюками, возможность которых изначально не закладывалась в механизм — тоже не грех, если это делается или для демонстрации забавного эффекта, или сугубо для себя, или сугубо временно, в ожидании реализации соответствующих функций в компиляторах. А вот делать такие трюки нормой жизни, да еще рекомендовать их для изучения, освоения и повсеместного применения — не простой грех, а очень тяжкий. Подход называется "ну ведь получилось же, и работает, какие претензии?".
Вот сейчас уже есть нормальные константы. Вы перестали использовать перечисления для того, чтобы задавать константы?