Предупреждение 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, позволяет непреднамеренно использовать ссылку для изменения элементов контейнера. Если необходимо изменить только локальную переменную цикла, потенциально дорогое копирование неизбежно.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по