# V302. Member operator[] of 'foo' class has a 32-bit type argument. Use memsize-type here.

Анализатор обнаружил потенциально возможную ошибку при работе с классами, в которых имеется operator[]. Классы с перегруженным operator[] обычно представляют собой разновидность массива и аргументом operator[] является индекс запрашиваемого элемента. Если operator[] имеет аргумент 32-битного типа, то это может свидетельствовать об ошибке.

Рассмотрим пример, приводящий к сообщению V302:

    class MyArray {
      std::vector<float> m_arr;
      ...
      float &operator[](int i)  //V302
      {
        DoSomething();
        return m_arr[i];
      }
    } A;
    ...
    int x = 2000;
    int y = 2000;
    int z = 2000;
    A[x * y * z] = 33;

Если класс спроектирован для работы с большим количеством аргументов, то такая реализация operator[] является некорректной, так как не позволяет обращаться к элементам с порядковыми номерами более UINT_MAX. Диагностировать ошибку в приведенном примере можно только указав на потенциально опасный operator[]. Выражение "x * y * z" не выглядит подозрительным, так как отсутствует неявное приведение типа. Когда мы исправим operator[] следующим образом:

    float &operator[](ptrdiff_t i);

анализатор PVS-Studio предупредит о возможной ошибке в строке "A[x * y * z] = 33;" и мы сможем сделать код программы окончательно корректным. Пример исправленного кода:

    class MyArray {
      std::vector<float> m_arr;
      ...
      float &operator[](ptrdiff_t i)  //V302
      {
        DoSomething();
        return m_arr[i];
      }
    } A;
    ...
    ptrdiff_t x = 2000;
    ptrdiff_t y = 2000;
    ptrdiff_t z = 2000;
    A[x * y * z] = 33;

Родственными диагностическими сообщениями являются V108 и V120.