Сейчас мы тестируем компиляцию некоторого кода Qt под QtCreator с более новым gcc 7.3, доступным в Ubuntu 18 (ранее мы использовали gcc 4.9.3 под Ubuntu 16).
Qt обеспечивает enum
таким образом:
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
, они должны быть одного типа, нет? Я знаю, что существуют потенциальные проблемы, когда два возможных значения являются разными типами, но я не могу понять, почему в этом случае необходимо выполнять приведение типов.
Значения {0, 1, 2}
от enum
, и я бы подумал, что точно такой же тип исключает любую возможность для преобразования.
Единственная возможность, о которой я могу думать, это то, что нулевое значение перечисления по какой-то причине рассматривается как беззнаковое.