【问题标题】:How are constant expressions dealt with in c++ enum?c++ 枚举中如何处理常量表达式?
【发布时间】:2017-11-17 08:18:29
【问题描述】:

带有常量表达式的 c++ 枚举的范围是多少?这是我的代码

#include <iostream>

int main(){
    enum e3{min = -10, max = 100000};
    e3 x = e3(-1000);
    e3 y= e3(-100000912241);
    std::cout<<x<<" "<<y<<std::endl;
}

它输出-1000 -1216664433

这是怎么回事? 此外,The C++ programming language by Bjarne Stroustrup 指定整数类型转换为枚举的结果是未定义的,除非该值在枚举范围内。这个范围是多少,如何计算?

【问题讨论】:

  • 我建议不要将枚举值用作整数。这是一个糟糕的设计,因为这不是使用它们的目的。也许struct 是一个很好的替代品。这就是为什么 c++ 更喜欢 enum classes 而不是典型的枚举。

标签: c++ enums


【解决方案1】:

enum 的范围是基础类型的范围。编译器可能选择了int 作为enum 的基础类型。

允许这样做,因为 int(假设它在您的平台上是 32 位)可以包含您给它的所有显式值。

您可能会发现-100000912241 的类型在您的平台上是longlong long(请注意,C++ 中没有否定文字:-100000912241 是一元否定文字100000912241.)。但是-100000912241 无法适应int,因此您的代码的行为是未定义

如果您想检查enum 的底层类型,请使用std::underlying_type

参考:http://en.cppreference.com/w/cpp/types/underlying_type

【讨论】:

  • 有道理,但枚举的范围是多少?枚举是应该接受所有整数值还是只接受基于其初始化的特定范围内的值
  • @Krash:将其添加到答案中。
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
相关资源
最近更新 更多