Данное диагностическое правило добавлено по просьбе пользователей.
Анализатор позволяет обнаружить все неявные приведения 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 };