或者说,编译器可以假设一个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?
}
}
MyType
列表中未包含此情况,因此出现了case value ‘3’ not in enumerated type 'MyType'
的警告。至少g++
会发出警告。请注意,我已经尽力使翻译准确、简明扼要且易于理解,但不能更改原意。 - Ryan Hainingconst MyType C = static_cast<MyType>(value)
,那么这肯定是你最不用担心的问题吧?比如更新你的简历,并向法院申请更名,这样你的同事们就无法因为名字而在未来阻止你成为一名程序员了? - kfsonem
强制转换为int
呢?在这种特殊情况下,你已经破坏了m
的数据类型,这似乎是合理的。至少在这种简单的情况下,你也可以使用if
。我知道这并没有完全回答你的问题。只是在这种情况下,对于编译器会优化掉什么存在疑虑,似乎不太好,而绕过会带来歧义的语法则更好。 - Mobile Benvoid fun(int m) { return m>2? doTheStuffFor(m): fun(static_cast<MyType>(m)); }
并替换所有可能出现问题的调用。您还可以尝试使用MyExtendedType。 - lorro