У C enumконстанта має тип int. У C ++ це перелічений тип.
enum en_e{
en_e_foo,
en_e_bar=UINT64_MAX,
};
У C це порушення обмеження , що вимагає діагностики ( якщо UINT64_MAX перевищує INT_MAX, що дуже ймовірно). Компілятор змінного струму може взагалі відхилити програму, або він може надрукувати попередження, а потім створити виконуваний файл, поведінка якого невизначена. (Не на 100% зрозуміло, що програма, яка порушує обмеження, обов'язково має невизначену поведінку, але в цьому випадку стандарт не говорить про те, що таке поведінка, тому це все ще невизначена поведінка.)
gcc 6.2 не попереджає про це. clang робить. Це помилка в gcc; він неправильно блокує деякі діагностичні повідомлення, коли використовуються макроси зі стандартних заголовків. Дякую Гжегожу Шпетковському за пошук звіту про помилку: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71613
У C ++ кожен тип перелічення має базовий тип , який є деяким цілочисельним типом (не обов'язково int). Цей базовий тип повинен бути здатним представляти всі постійні значення. Отже, у цьому випадку обидва en_e_fooі en_e_barмають тип en_e, який повинен бути щонайменше 64 біта в ширину, навіть якщо intвін вужчий.