【发布时间】:2016-11-30 19:39:31
【问题描述】:
如果我尝试编译下面的代码,它会给我错误'枚举器值对于底层类型'char'来说太大
enum class Status:char{one=126,two=127,three=128};
Status s = Status::three;
但是,如果我执行以下代码,编译器不会给我任何错误,并且会默默地忽略超过 char 上限
char x = 128;
那么,编译器在普通数据类型的情况下不检查并在枚举基础类型的情况下检查范围有什么具体原因。
【问题讨论】:
-
我猜是为了向后兼容。如果不允许这样做,您可能会觉得将返回的
int的 API(如getchar()或istream::get())转换为char非常烦人。 -
看起来
char已在您的实现中签名。它的值可能在 -128 到 127 之间。128 会溢出char,但不是格式错误的。请注意,有符号溢出是未定义的行为。不过,我想有一个未定义值的常量是不正确的。 -
您使用的是哪个编译器? gcc-6.1 说
error: enumerator value 128 is outside the range of underlying type ‘char’。