Sdílet prostřednictvím


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é.