No utilice el subíndice de matriz cuando el índice no es una expresión constante entera; use gsl::at() en su lugar

No utilice el subíndice de matriz cuando el índice no es una expresión constante entera; use gsl::at() en su lugar

Es una advertencia de que arr[i] no realiza ninguna verificación de límites y debe usar gsl::at(arr, i) de https://github.com/Microsoft/GSL, ya que comprueba los límites y es más seguro.


En general

for (size_t i = 0; i < size; ++i)
    arr[i] = something;

es peligroso. No puedes saber si arr[i] va a salir de los límites de la matriz. Esta es la razón por la que las Directrices básicas de C++ sugieren que utilice gsl::at() ya que verificará los límites para asegurarse de que no se salga de los límites de la matriz.

Aunque esta no es la única solución. Si solo necesita iterar sobre el rango, puede usar un rango basado en un bucle como

for (const auto& e : arr)
    //e is each element of the array and is not mutable here

o

for (auto& e : arr)
    //e is each element of the array and is mutable here

Y para un caso como el suyo donde necesita llenar la matriz, puede usar std::iota Me gusta

std::iota(std::begin(arr), std::end(arr), 0);

y todos estos están garantizados para no salirse de los límites.


Creo que el motivo de la advertencia es que operator[] no verifica los límites, mientras que gsl::at() pudo.

Desde size se conoce en tiempo de compilación, si el índice era constexpr , podría recibir una advertencia, pero si el valor se determina en tiempo de ejecución, no puede hacerlo. En mi opinión bastante innecesario.