此代码:
enum : unsigned { foo = 4 };
enum : unsigned { bar = 32 };
int main() { return bar > foo; }
给了我以下警告(使用GCC 5.4.0):
$ g++ --std=c++11 -o a a.cpp
a.cpp: In function ‘int main()’:
a.cpp:4:27: warning: comparison between ‘enum<anonymous>’ and ‘enum<anonymous>’ [-Wenum-compare]
int main() { return bar > foo; }
^
为什么?我已经确切地指定了这些枚举值具有哪些类型,比较它们并不存在任何不确定性。我甚至为两个枚举使用了相同的类型(不是它应该重要)。那么这里的交易是什么?
请注意,即使使用-Wall
,clang(3.8.0)也不会产生此警告。
答案 0 :(得分:2)
为什么?我已经明确指出了这些枚举值具有哪些类型,比较它们并不存在任何不确定性。我甚至为两个枚举使用了相同的类型(不是它应该重要)。那么这里的交易是什么?
警告没有说明不确定性,它告诉你你正在比较不同的类型。如果值由不同类型表示,那么它表明它们意味着不同的东西,因此比较它们可能是有问题的。正如大卫所说,将N个苹果与M个橘子进行比较是奇怪的,值得警告。
基础类型不会改变任何内容,因为foo
不是unsigned
,而bar
不是unsigned
。如果您想比较unsigned
值,那么编译器假定您使用unsigned
而不是枚举类型。
根据您对其他答案的评论:
因为我在(不同的)类中使用枚举作为常量 - 例如限制和大小。
为什么呢?使用constexpr静态数据成员有什么问题?
C ++核心指南中对此进行了介绍,请参阅Avoid unnamed enumerations:
在使用指定整数常量的方便替代方法之前编写的代码中,此类代码并不少见。
替代方法:改为使用constexpr值。