gpt4 book ai didi

c++ - "enumeral and non-enumeral type in conditional expression"背后的推理

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:37:29 53 4
gpt4 key购买 nike

自 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
};
};

最佳答案

这看起来像是 GCC 中的一个问题。这不依赖于 -std=c++11 选项。该警告与比较无关,而与条件运算符有关。

似乎只有当其中一个枚举成员用无符号值初始化,而另一个枚举成员用另一个枚举的值初始化时,才会发出警告。此外,警告仅在枚举成员初始化时发出。

我设法将代码精简为以下内容:

enum A { valueA = 1 };

enum B {
// if you change 0u to 0, there'll be no warning
thisval = 0u,
// if you change valueA to any integral constant, there'll be no warning
nextval = valueA,
// warning on this line
value = nextval > thisval ? nextval : thisval,
// no warning here
value2 = nextval > thisval
};

int main() {
// no warning here
(void)(nextval > thisval ? nextval : thisval);
// the same warning also here - but not with Clang
(void)(nextval > thisval ? nextval : false);
}

Online demo

Clang 不会对此代码发出任何警告(除了 -Weverything 它会提示无法访问的代码),尽管它真的可以在最后一行说些什么。

(海湾合作委员会 4.9.2, clang 3.5.0)

关于c++ - "enumeral and non-enumeral type in conditional expression"背后的推理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29685367/

53 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com