首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gcc7中的Enum和三值奇异行为

gcc7中的Enum和三值奇异行为
EN

Stack Overflow用户
提问于 2019-06-04 02:06:29
回答 1查看 393关注 0票数 2

我们现在正在用Ubuntu 18中更新的gcc 7.3测试在QtCreator下编译一些Qt代码(我们以前在Ubuntu 16下使用gcc 4.9.3 )。

因此,Qt提供了一个enum

代码语言:javascript
复制
enum CheckState {
    Unchecked,
    PartiallyChecked,
    Checked
};

现在,当我们使用三元操作符时:

代码语言:javascript
复制
QVariant MyClass::MyFunc(const QModelIndex &index, int role) const {
    return (someCondition ? Qt::Checked : Qt::Unchecked);
}

然后gcc会抱怨(带有警告,但我们将警告视为错误):

代码语言:javascript
复制
prog.cpp:999:99:
    error: passing ‘Qt::CheckState’ chooses ‘int’
        over ‘uint {aka unsigned int}’ [-Werror=sign-promo]

我们可以通过以下方式来解决这个问题:

代码语言:javascript
复制
return (someCondition ? Qt::Checked : static_cast<int>(Qt::Unchecked));

但我不知道为什么要这么做。

因为它们来自完全相同的enum,所以它们应该是相同的类型,不是吗?我知道可能存在两个可能的值是不同类型的问题,但我不明白为什么在这种情况下需要进行这种类型的转换。

这些值是来自于{0, 1, 2}enum,我认为完全相同的类型否定了任何转换的可能性。

我能想到的唯一可能是,枚举的零值由于某种原因被视为无符号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-04 02:29:23

为了代替MCVE,我假设上下文类似于:

代码语言:javascript
复制
struct S
{
    S(int);
    S(unsigned int);
};

S foo()
{
    return (1 ? Qt::Checked : Qt::Unchecked);
}

哪个在gcc 7.3中产生警告

警告:通过Qt::CheckState会选择int而不是unsigned int -Wsign

此警告与将enum CheckState类型的值隐式转换为整数有关。有有效的隐式转换到intunsigned int,重载解析选择int

显然,这个警告的理由是,gcc的一些老版本在这个场景中选择了unsigned int,而gcc 7遵循了标准,选择了int

您的修复可以工作,因为第二个和第三个操作数是在重载解析发生之前将第二个和第三个操作数带到一个公共类型的int中的(与您选择的枚举数无关)。

也许一个适当的解决方法是将static_cast<int>应用于整个条件,而不仅仅是一个操作数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56436497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档