Aviso C26817

Cópia potencialmente cara do nome da variável no loop range-for. Considere torná-lo uma referência constante (es.71).

Para obter mais informações, confira Notas ES.71 nas Diretrizes Principais do C++.

Exemplo

Se uma variável de loop range-for não for marcada explicitamente como uma referência, ela receberá uma cópia de cada elemento iterado:

#include <vector>

class MyComplexType {
    int native_array[1000];
    // ...
};

void expensive_function(std::vector<MyComplexType>& complex_vector_ref)
{
    for (auto item: complex_vector_ref) // Warning: C26817
    {
        // At each iteration, item gets a copy of the next element
        // ...
    }
    for (MyComplexType item: complex_vector_ref)
    {
        // It happens whether you use the auto keyword or the type name
        // ...
    }
}

O aviso está ignorando alguns tipos que são baratos de copiar, como para escalares (ponteiros, tipos aritméticos e assim por diante).

Para corrigir esse problema, se a variável de loop não for alterada em nenhum lugar no loop, torne-a uma referência constante:

#include <vector>

class MyComplexType {
    int native_array[1000];
    // ...
};

void less_expensive_function(std::vector<MyComplexType>& complex_vector_ref)
{
    for (const auto& item: complex_vector_ref)
    {
        // item no longer gets a copy of each iterated element
        // ...
    }
    for (const MyComplexType& item: complex_vector_ref)
    {
        // item no longer gets a copy of each iterated element
        // ...
    }
}

A palavra-chave const torna a variável de loop imutável. O uso de uma referência não const torna possível usar inadvertidamente a referência para modificar os elementos do contêiner. Se você precisar modificar apenas a variável de loop local, a cópia potencialmente cara será inevitável.