Dela via


Varning C26817

Potentiellt dyr kopia av variabelnamn i range-for-loop. Överväg att göra det till en const-referens (es.71).

Anmärkningar

För mer information, se ES.71: Föredra ett rang-for-uttryck framför ett for-uttryck när det finns ett val i C++ Core Guidelines.

Exempel

Om en intervall-för-loop-variabel inte uttryckligen markeras som en referens, hämtar den en kopia av varje element som itereras över:

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

Varningen ignorerar vissa typer som är billiga att kopiera som för skalärer (pekare, aritmetiska typer och så vidare).

Om loopvariabeln inte är muterad någonstans i loopen gör du det till en const-referens för att åtgärda problemet:

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

Nyckelordet const gör loopvariabeln oföränderlig. Användning av en icke-const-referens gör det möjligt att oavsiktligt använda referensen för att ändra containerns element. Om du bara behöver ändra variabeln för den lokala loopen är den potentiellt dyra kopieringen oundviklig.