Avertissement C26817

Copie potentiellement coûteuse du nom de variable dans la boucle range-for. Envisagez d’en faire une référence const (es.71).

Pour plus d’informations, consultez les notes ES.71 dans les instructions de base C++.

Exemple

Si une variable de boucle range-for n’est pas explicitement marquée comme référence, elle obtient une copie de chaque élément itéré sur :

#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
        // ...
    }
}

L’avertissement ignore certains types qui sont bon marché à copier comme pour les scalaires (pointeurs, types arithmétiques, etc.).

Pour résoudre ce problème, si la variable de boucle n’est pas mutée n’importe où dans la boucle, faites-la référence const :

#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
        // ...
    }
}

La const mot clé rend la variable de boucle immuable. L’utilisation d’une référence non const permet d’utiliser par inadvertance la référence pour modifier les éléments du conteneur. Si vous devez modifier uniquement la variable de boucle locale, la copie potentiellement coûteuse est inévitable.