为什么g ++警告我将枚举值与指定的底层类型进行比较?

时间:2017-04-24 19:40:16

标签: gcc enums clang compiler-warnings underlyingtype

此代码:

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)也不会产生此警告。

1 个答案:

答案 0 :(得分:2)

  

为什么?我已经明确指出了这些枚举值具有哪些类型,比较它们并不存在任何不确定性。我甚至为两个枚举使用了相同的类型(不是它应该重要)。那么这里的交易是什么?

警告没有说明不确定性,它告诉你你正在比较不同的类型。如果值由不同类型表示,那么它表明它们意味着不同的东西,因此比较它们可能是有问题的。正如大卫所说,将N个苹果与M个橘子进行比较是奇怪的,值得警告。

基础类型不会改变任何内容,因为foo不是unsigned,而bar不是unsigned。如果您想比较unsigned值,那么编译器假定您使用unsigned而不是枚举类型。

根据您对其他答案的评论:

  

因为我在(不同的)类中使用枚举作为常量 - 例如限制和大小。

为什么呢?使用constexpr静态数据成员有什么问题?

C ++核心指南中对此进行了介绍,请参阅Avoid unnamed enumerations

  

在使用指定整数常量的方便替代方法之前编写的代码中,此类代码并不少见。

     

替代方法:改为使用constexpr值。