gpt4 book ai didi

c++ - gcc7 中的枚举和三元奇怪行为

转载 作者:行者123 更新时间:2023-11-30 03:16:18 25 4
gpt4 key购买 nike

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

Qt 提供了一个枚举,因此:

enum CheckState {
Unchecked,
PartiallyChecked,
Checked
};

现在,当我们使用三元运算符时:

QVariant MyClass::MyFunc(const QModelIndex &index, int role) const {
return (someCondition ? Qt::Checked : Qt::Unchecked);
}

然后 gcc 提示(带有警告,但我们将警告视为错误):

prog.cpp:999:99:
error: passing ‘Qt::CheckState’ chooses ‘int’
over ‘uint {aka unsigned int}’ [-Werror=sign-promo]

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

return (someCondition ? Qt::Checked : static_cast<int>(Qt::Unchecked));

但我不确定为什么这是必要的。

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

值是 enum 中的 {0, 1, 2} 并且我会认为 完全相同 类型否定了任何可能性转换。

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

最佳答案

代替 MCVE,我假设上下文是这样的:

struct S
{
S(int);
S(unsigned int);
};

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

哪个produces warning in gcc 7.3 :

warning: passing Qt::CheckState chooses int over unsigned int [-Wsign-promo]


警告与类型值的隐式转换有关 enum CheckState为整数。 int 都存在有效的隐式转换和 unsigned int ,重载决议选择int .

显然,警告的理由是选择了一些旧版本的 gcc unsigned int在这种情况下,但 gcc 7 遵循标准并选择 int .

你的修复工作是因为第二个和第三个操作数被带到了一个共同的类型 int在发生重载解析之前(这与您选择的枚举器无关)。

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

关于c++ - gcc7 中的枚举和三元奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56436497/

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