Udostępnij za pośrednictwem


Ostrzeżenie C26817

Potencjalnie kosztowna kopia nazwy zmiennej w pętli range-for. Rozważ utworzenie odwołania const (es.71).

Aby uzyskać więcej informacji, zobacz uwagi dotyczące wersji ES.71 w wytycznych podstawowych dotyczących języka C++.

Przykład

Jeśli zmienna pętli range-for nie jest jawnie oznaczona jako odwołanie, pobiera kopię każdego elementu iterated na:

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

Ostrzeżenie ignoruje niektóre typy, które są tanie do kopiowania w przypadku skalarnych (wskaźniki, typy arytmetyczne itd.).

Aby rozwiązać ten problem, jeśli zmienna pętli nie jest zmutowana w dowolnym miejscu w pętli, utwórz odwołanie 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
        // ...
    }
}

Słowo kluczowe sprawia, że zmienna const pętli jest niezmienna. Użycie odwołania innego niż const umożliwia przypadkowo użycie odwołania do modyfikowania elementów kontenera. Jeśli musisz zmodyfikować tylko zmienną pętli lokalnej, potencjalnie kosztowne kopiowanie jest nieuniknione.