Я полагаю принятый ответ на указанный вопрос отвечает на большинство вопросов, касающихся совместимости ABI.Я мог бы повторить это здесь, но я не вижу большой ценности там.
Чтобы ответить на ваш конкретный вопрос о перечислениях C ++ 11, ваш пример:
enum class Foo : uint8_t { x = 257 }
плохо сформирован, так какэто требует сужающего преобразования, реализация должна обеспечивать диагностику, но она может компилироваться, если реализация только предупреждает, например.Как вы и просили, компилятор не будет молча менять размер базового типа.
Это видно из черновика стандарта C ++ dcl.enump5 :
Каждое перечисление определяет тип, который отличается от всех других типов.Каждое перечисление также имеет базовый тип.Базовый тип может быть явно указан с помощью enum-base.Для перечисляемого типа с ограниченным диапазоном базовым типом является int, если он не указан явно.В обоих этих случаях базовый тип считается фиксированным.После закрывающей скобки спецификатора перечисления каждый перечислитель имеет тип своего перечисления. Если базовый тип является фиксированным, тип каждого перечислителя перед закрывающей скобкой является базовым типом, а константное выражение в определении перечислителя должно быть преобразованным константным выражением базового типа .Если базовый тип не является фиксированным, тип каждого перечислителя перед закрывающей скобкой определяется следующим образом: ...
и преобразованное константное выражение запретить сужающее преобразование из expr.constp5 :
Преобразованное константное выражение типа T является выражением, неявно преобразованным в тип T, где преобразованное выражение является константным выражением, а последовательность неявного преобразования содержиттолько
...
- интегральные преобразования , кроме сужающих преобразований ,
...