Compartir a través de


Advertencia C26817

Copia potencialmente costosa de la variable name en el bucle range-for. Considere la posibilidad de convertirla en una referencia const (es.71).

Para más información, consulte las notas de ES.71 en C++ Core Guidelines.

Ejemplo

Si una variable de bucle range-for no se marca explícitamente como referencia, obtiene una copia de cada elemento sobre el que se itera:

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

La advertencia ignora algunos tipos que son baratos de copiar como para escalares (punteros, tipos aritméticos, etc.).

Para corregir este problema, si la variable de bucle no se muta en ningún lugar del bucle, conviértala en una referencia 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
        // ...
    }
}

La palabra clave const hace que la variable de bucle sea inmutable. El uso de una referencia no const permite usar accidentalmente la referencia para modificar los elementos del contenedor. Si solo necesita modificar la variable de bucle local, la copia potencialmente costosa es inevitable.