Upozornění C26817
Potenciálně náročná kopie názvu proměnné ve smyčce range-for Zvažte, že se jedná o odkaz const (es.71).
Další informace najdete v poznámkách ES.71 v pokynech pro C++ Core Guidelines.
Příklad
Pokud proměnná smyčky range-for není explicitně označená jako odkaz, získá kopii každého prvku s iteratedm:
#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
// ...
}
}
Upozornění ignoruje některé typy, které jsou levné kopírovat jako u skalárů (ukazatele, aritmetické typy atd.).
Pokud chcete tento problém vyřešit, pokud proměnná smyčky není nikam ve smyčce ztlumená, nastavte ji jako odkaz na 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
// ...
}
}
Klíčové const
slovo činí proměnnou smyčky neměnnou. Použití odkazu, který není const, umožňuje neúmyslně použít odkaz k úpravě prvků kontejneru. Pokud potřebujete upravit pouze proměnnou místní smyčky, potenciálně nákladné kopírování není možné.