Condividi tramite


Avviso C26817

Copia potenzialmente costosa del nome della variabile nel ciclo range-for. Valutare la possibilità di renderlo un riferimento const (es.71).

Per altre informazioni, vedere Note di ES.71 nelle linee guida di base di C++.

Esempio

Se una variabile di ciclo range-for non è contrassegnata in modo esplicito come riferimento, ottiene una copia di ogni elemento iterato su:

#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'avviso ignora alcuni tipi che sono economici da copiare come per i scalari (puntatori, tipi aritmetici e così via).

Per risolvere questo problema, se la variabile di ciclo non viene modificata in qualsiasi punto del ciclo, impostarla come riferimento 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 parola chiave rende la variabile di ciclo non modificabile. L'uso di un riferimento non const consente di usare inavvertitamente il riferimento per modificare gli elementi del contenitore. Se è necessario modificare solo la variabile del ciclo locale, la copia potenzialmente costosa è inevitabile.