Megosztás:


figyelmeztetés C26817

A változó name potenciálisan költséges másolata a range-for ciklusban. Fontolja meg, hogy const-referenciává tegye (es.71).

Megjegyzések

További információért lásd az ES.71: Előnyben részesítsen egy tartomány< c0 />-utasítást egy< c1 />-utasítással szemben, amikor választási lehetősége van a C++ alapvető irányelveiben.

példa

Ha a range-for ciklus változója nincs explicit módon hivatkozásként megjelölve, akkor minden iterált elemről másolat készül.

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

A figyelmeztetés figyelmen kívül hagy néhány olyan típust, amelyek másolása olcsó, mint a skalárisok (mutatók, számtani típusok stb.).

A probléma megoldásához, ha a hurokváltozó nem mutált a hurok egyik pontján sem, állítsd be const-hivatkozásként:

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

A const kulcsszó nem módosíthatóvá teszi a hurokváltozót. A nem konstans hivatkozás használata lehetővé teszi a hivatkozás véletlen használatát a tároló elemeinek módosításához. Ha csak a helyi hurok változóját kell módosítania, a potenciálisan költséges másolás elkerülhetetlen.