"条件表达式中的数字和非数字类型"背后的推理

Ich*_*hyo 6 c++ coding-style c++11

由于C++ 11转换GCC在条件表达式中输出警告"枚举和非枚举类型".我想了解这个警告背后的原因.比较枚举常数有什么危险?

很明显,我们可以摆脱这种警告

  • -Wno-enum-compare
  • 通过显式转换为整数类型

但为什么麻烦?就个人而言,我总是努力编写警告免费代码,通常默认发出的警告是非常明智的.例如,它认为比较有符号和无符号整数是危险的.

但使用枚举广泛使用惯用的C++元编程.我不知道任何替代方案,它具有类似的可读性,简洁性和重点,并且不需要任何实际存储.

引用一个具体的例子:以下元函数可能出现什么问题,以便警告就足够了?

template<class TYPES>
struct MaxSize;
template<>
struct MaxSize<NullType>
  {
    enum{ value = 0 };
  };
template<class TY, class TYPES>
struct MaxSize<Node<TY,TYPES> >
  {
    enum{ thisval = sizeof(TY)
        , nextval = MaxSize<TYPES>::value
        , value   = nextval > thisval?  nextval:thisval
        };
  };
Run Code Online (Sandbox Code Playgroud)

Dal*_*son 2

如果您使用枚举作为定义编译时常量值的方式,那么您现在可以停止这样做。

使用这个代替:

constexpr int myConstant = 123;
Run Code Online (Sandbox Code Playgroud)

哪里int可以是任何符合条件的东西literal type [我不会尝试在这里定义文字类型——它很复杂,Google 是你的朋友。]

或者,即使在 c++11 之前,你也可以说:

class Foo{
    static const int myConstant = 123;
 };
Run Code Online (Sandbox Code Playgroud)

其中 int 可以是任何整数类型。

除非您需要 myConstant 的地址,否则不需要在 cpp 文件中具有相应的定义。

编译器告诉您,将枚举值与同一枚举中除另一个值之外的任何值进行比较都是脆弱的代码。