当索引不是整数常量表达式时,不要使用数组下标; 使用gsl :: at()代替

use*_*999 6 c++ resharper-c++ cpp-core-guidelines

我试图在Microsoft Visual Studio中创建一些示例代码

int main()
{
    const size_t size = 10;
    int arr[size];

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

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在JetBrains ResharperC++发出以下警告 arr[i] = i;

在此输入图像描述 当索引不是整数常量表达式时,不要使用数组下标; 使用gsl :: at()代替

我无法理解这意味着什么以及如何解决此警告.

由于这是我经常使用的方案,我有点担心警告.

任何人都可以建议或指出我正确的方向吗?

编辑:将循环更改为:

for (size_t i = 0; i < size; ++i)
    arr[i] = 0;
Run Code Online (Sandbox Code Playgroud)

仍然会发出警告.

Nat*_*ica 3

一般来说

for (size_t i = 0; i < size; ++i)
    arr[i] = something;
Run Code Online (Sandbox Code Playgroud)

很危险。您无法判断是否arr[i]会超出数组范围。这就是C++ 核心指南建议您使用的原因gsl::at(),因为它将进行边界检查以确保您不会超出数组范围。

但这不是唯一的解决方案。如果您只需要在范围内迭代,您可以使用基于范围的 for 循环,例如

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

或者

for (auto& e : arr)
    //e is each element of the array and is mutable here
Run Code Online (Sandbox Code Playgroud)

对于像您这样的情况,您需要填充数组,您可以使用std::iota

std::iota(std::begin(arr), std::end(arr), 0);
Run Code Online (Sandbox Code Playgroud)

并且所有这些都保证不会出界。