考虑这个简单的代码:
int main() {
enum Simple { one = 1, two = 2 };
Simple m1 = static_cast<Simple>(-1);
if (m1 < 0) return -1;
return 1;
}
毫不奇怪,这会返回-1。
令人惊讶的是,当我使用std :: underlying_type&lt; Simple&gt;时,底层类型是&#34; unsigned int&#34;。跆拳道?如果Simple的基础类型是无符号的,那么它是如何小于零的呢?
进一步的证据:
int main(int argc, char *argv[]) {
enum Simple { one = 1, two = 2 };
Simple m1 = static_cast<Simple>(-1);
std::underlying_type<Simple>::type underlying = m1;
long long llm1 = m1;
std::cout << "simple=" << m1
<< " underlying=" << underlying
<< " long long=" << llm1
<< "\n";
}
产地:
simple = -1 underlying = 4294967295 long long = 4294967295
答案 0 :(得分:2)
8)整数,浮点或枚举类型可以转换为任何完整的枚举类型。结果是未指定(直到C ++ 17)未定义行为(因为C ++ 17),如果转换为枚举的基础类型的表达式的值不在范围(如果基础类型是固定的,范围是类型的范围。如果基础类型不固定,则范围是可能的最小位字段的所有值,足以容纳目标枚举的所有枚举数)