Поделиться через


Предупреждение C26817

Потенциально дорогое копирование имени переменной в диапазоне для цикла. Попробуйте сделать его константной ссылкой (es.71).

Дополнительные сведения см . в заметках ES.71 в основных рекомендациях по C++ .

Пример

Если переменная цикла диапазона не помечена как ссылка явным образом, она получает копию каждого элемента, перевернутого:

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

Предупреждение игнорирует некоторые типы, которые дешевле копировать, как для скалярных (указателей, арифметических типов и т. д.).

Чтобы устранить эту проблему, если переменная цикла не мутирована в любом месте цикла, сделайте ее ссылкой 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
        // ...
    }
}

Ключевое const слово делает переменную цикла неизменяемой. Использование ссылки, отличной от const, позволяет непреднамеренно использовать ссылку для изменения элементов контейнера. Если необходимо изменить только локальную переменную цикла, потенциально дорогое копирование неизбежно.