Определение значения класса перечисления из предыдущих значений [дубликат]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Определение значения класса перечисления из предыдущих значений [дубликат]

Сообщение Anonymous »

Согласно 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»