Delen via


Waarschuwing C26817

Mogelijk dure kopie van variabele naam in een range-for-lus. Overweeg het een const-verwijzing te maken (es.71).

Opmerkingen

Zie ES.71 voor meer informatie: Geef de voorkeur aan een bereik-uitdrukkingfor boven een for-uitdrukking wanneer er een keuze is in de C++ Core Guidelines.

Voorbeeld

Als een variabele in een bereik-lus niet expliciet als verwijzing is gemarkeerd, krijgt het een kopie van elk element waarover wordt geïtereerd.

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

De waarschuwing negeert sommige typen die goedkoop zijn om te kopiëren, zoals voor scalaire waarden (aanwijzers, rekenkundige typen, enzovoort).

Om dit probleem op te lossen, zet u de lusvariabele om naar een constante verwijzing als deze nergens in de lus wordt aangepast.

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

Het const trefwoord maakt de lusvariabele onveranderbaar. Gebruik van een niet-const-verwijzing maakt het mogelijk om per ongeluk de verwijzing te gebruiken om de elementen van de container te wijzigen. Als u alleen de lokale lusvariabele wilt wijzigen, is de potentieel dure kopieeractie onvermijdelijk.