Warnung C26817

Potenziell teure Kopie des Variablennamens in bereichsbezogener Schleife. Erwägen Sie, ihn zu einem Konstverweis (es.71) zu machen.

Weitere Informationen finden Sie in den C++-Kernrichtlinien unter ES.71-Hinweise .

Beispiel

Wenn eine Bereichsvariable für Schleifen nicht explizit als Verweis gekennzeichnet ist, wird eine Kopie der einzelnen Elemente, die durchlaufen werden, angezeigt:

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

Die Warnung ignoriert einige Typen, die billig zu kopieren sind, wie für Skalare (Zeiger, arithmetische Typen usw.).

Wenn die Schleifenvariable nicht an einer beliebigen Stelle in der Schleife stumm geschaltet ist, stellen Sie dieses Problem als Konstverweis fest:

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

Die const Schlüsselwort (keyword) macht die Schleifenvariable unveränderlich. Die Verwendung eines Nichtkonstverweises ermöglicht es, versehentlich den Verweis zu verwenden, um die Elemente des Containers zu ändern. Wenn Sie nur die lokale Schleifenvariable ändern müssen, ist das potenziell teure Kopieren unvermeidbar.