Do not use array subscript when the index is not an integer constant expression; use gsl::at() instead
Its a warning that arr[i]
doesn't do any bounds checking and that you should use gsl::at(arr, i)
from https://github.com/Microsoft/GSL instead as it does bounds checking and is safer.
In general
for (size_t i = 0; i < size; ++i)
arr[i] = something;
is dangerous. You can't tell if arr[i]
is going to go out of bounds of the array. This is why the C++ Core Guidelines suggest you use gsl::at()
as it will do bounds checking to make sure you do not go out of bounds on the array.
This isn't the only solution though. If you just need to iterator over the range you can use a range based for loop like
for (const auto& e : arr)
//e is each element of the array and is not mutable here
or
for (auto& e : arr)
//e is each element of the array and is mutable here
And for a case like yours where you need to fill the array you can use std::iota
like
std::iota(std::begin(arr), std::end(arr), 0);
and all of these are guaranteed to not go out of bounds.
I think the reason for the warning is that operator[]
does not boundary check, while gsl::at()
could.
Since size
is known in compile time, if the index was constexpr
, you could get a warning, but if the value is determined in runtime you can't. In my opinion pretty unnecessary.