From clang-tidy – cppcoreguidelines-pro-bounds-pointer-arithmetic:
Pointers should only refer to single objects, and pointer arithmetic is fragile and easy to get wrong.
span<T>is a bounds-checked, safe type for accessing arrays of data.
So yes:
Is there an alternative way to use the values of argv without using pointer arithmetic? Isn’t accessing a char** by any sensible method going to have to use pointer arithmetic?
You’re entirely correct. However, the guideline is about hiding that pointer arithmetic, letting a helper class do bounds checks before performing the arithmetic. You can construct a span<char*> from argv and argc. E.g. in C++20 you would write:
auto args = std::span(argv, size_t(argc));
and then use args instead of argv.