2016-09-02 5 views
4

Или другой способ выразить это: может ли компилятор предположить, что экземпляр enum может содержать только те значения, которые он объявляет удерживать и оптимизировать на основе этого предположения?Разрешено ли компилятору оптимизировать ветку, зависящую от перечисления, имеющего необъявленное значение?

enum MyType { A = 1, B = 2 }; 

const MyType C = static_cast<MyType>(3); 

void fun(MyType m) { 
    switch (m) { 
     case A: 
      // ... 
      break; 
     case B: 
      // ... 
      break; 
     case C: 
      // can this be optimized away? 
    } 
} 
+0

Непонятно, что вы спрашиваете? Почему должен быть оптимизирован случай 'C'? Я не вижу ясных аргументов в пользу этого. –

+4

@ πάνταῥεῖ, потому что он не включен в список для 'MyType'. 'g ++' по крайней мере предупреждает об этом значении '3 'не в перечисляемом типе« MyType » –

+0

@RyanHaining Конечно, это наименьшая из ваших проблем, если вы выполняете' const MyType C = static_cast (value) '? Например, обновите свое резюме и подадите в суд для изменения юридического имени, чтобы ваши сотрудники не могли позорить вас из-за получения работы в качестве программиста в будущем? – kfsone

ответ

4

Компилятор не может оптимизировать необъявленные значения перечисления. В разделе, посвященном спецификациям языка, которые говорят о счетчиках, говорится:

Можно определить перечисление, значение которого не определено ни одним из его счетчиков.

поэтому перечисление допускается иметь значения, которые явно не указаны в объявлении перечисления.

Кроме того, раздел по типам битмасс дает примеры, в которых используются неопределенные значения перечисления, в частности упоминание 0 в качестве допустимого значения флага.

Поскольку он имеет значения enum, которые не объявлены, компилятор не может оптимизировать код, который их использовал.

+1

Вид правильный. Имеются допустимые значения, которые могут отсутствовать в списке перечислителей, это не означает, что все целочисленные значения являются допустимыми значениями для перечисления. См. Http://stackoverflow.com/a/4969304/87234 – GManNickG