Данное диагностическое правило добавлено по просьбе пользователей.
Анализатор позволяет обнаружить все неявные приведения enum-типов к целочисленным типам.
Диагностическое правило V2006 помогает выполнить рефакторинг кода и иногда выявить ошибки.
Пример конструкции, на которую анализатор выдаст данное диагностическое сообщение:
enum Orientation {
Horizontal = 0x1,
Vertical = 0x2
};
Orientation orientation = Horizontal;
int pos = orientation; // V2006
Диагностическое сообщение V2006 не выдается в следующих случаях.
Первое. Анализатор не предупреждает о сравнении именованной константы перечисления с переменной имеющий тип, например 'int'. Хотя перед началом сравнения константа неявно приводится к типу 'int', такое встречается слишком часто, чтобы выдавать на это предупреждение.
int pos = foo();
if (pos == Vertical) // Ok
{
....
}
Второе. Сравниваются две константы перечисляемого типа:
enum E
{
ZERO, ONE, TWO
};
void foo(E e1, E e2)
{
if (e1 == e2) // ok
....
else if (e1 > e2) // ok
....
else if (e1 != e2) // ok
....
}
Третье. Неявное преобразование типа происходит при сдвиге именованной константы, чтобы инициализировать другую именованную константу или элементы массива:
enum E
{
FIRST_BIT = 1,
SECOND_BIT = FISRT_BIT << 1, // ok
THIRD_BIT = FISRT_BIT << 2, // ok
....
};
int A[3] = {
FIRST_BIT,
FIRST_BIT << 1, // ok
FIRST_BIT << 2 // ok
};