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.