Согласно cppreference, разрешено определять значение перечисления без области видимости, используя предыдущие значения того же перечисления, например вот так:
Код: Выделить всё
enum MyEnum_U {
u_foo = 2,
u_bar = 5,
u_baz = u_foo + u_bar + 2
};
Предыдущий случай мне довольно ясен, но я не уверен, разрешено ли то же самое для класса перечисления с ограниченной областью, поскольку я не нашел примеров для этого случая. Примерно так:
Код: Выделить всё
enum class MyEnum_S : int {
foo = 2,
bar = 5,
baz = foo + bar + 2
};
Я не уверен, является ли это определенным или неопределенным поведением, поскольку значения перечисления с ограниченной областью действия не должны быть неявно преобразованы в их собственный тип. Например, если я попытаюсь добавить эти значения перечисления за пределы области определения, я получу ожидаемые ошибки компилятора, связанные с отсутствием определенного оператора +.
Я также могу написать последнее определение значения, например
Код: Выделить всё
baz = static_cast(foo) + static_cast(bar) + 2
или даже как
Код: Выделить всё
baz = static_cast(MyEnum_S::foo) + static_cast(MyEnum_S::bar) + 2
Являются ли все вышеперечисленные случаи четко определенным поведением C++ или что-то зависит от неопределенного поведения и поэтому его следует опустить?
Я тестировал последние версии GCC и MSVC, и они принимают все варианты.
Примечание: если это имеет значение, я пытаюсь написать независимый от компилятора код, обратно совместимый с C++14, но также приветствуются ответы, зависящие от более поздних стандартов C++.
Подробнее здесь:
https://stackoverflow.com/questions/798 ... ior-values