为什么当T不是时,std :: underlying_type <t>是无符号的?

时间:2015-11-02 20:31:59

标签: c++ c++11 enums unsigned-integer

考虑这个简单的代码:

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

1 个答案:

答案 0 :(得分:2)

阅读static_cast

的文档
  

8)整数,浮点或枚举类型可以转换为任何完整的枚举类型。结果是未指定(直到C ++ 17)未定义行为(因为C ++ 17),如果转换为枚举的基础类型的表达式的值不在范围(如果基础类型是固定的,范围是类型的范围。如果基础类型不固定,则范围是可能的最小位字段的所有值,足以容纳目标枚举的所有枚举数)