Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Cópia potencialmente cara do nome da variável no loop range-for. Considere torná-lo uma referência constante (es.71).
Observações
Para mais informações, veja ES.71: prefira utilizar uma instrução defor intervalo ao invés de uma forinstrução quando há uma opção nas Orientações principais do C++.
Exemplo
Se uma variável de loop range-for não for marcada explicitamente como uma referência, ela receberá uma cópia de cada elemento iterado:
#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
// ...
}
}
O aviso está ignorando alguns tipos que são baratos de copiar, como escalares (ponteiros, tipos aritméticos e assim por diante).
Para corrigir esse problema, se a variável de loop não for alterada em nenhum lugar no loop, torne-a uma referência constante:
#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
// ...
}
}
A palavra-chave const torna a variável de loop imutável. O uso de uma referência não const possibilita o uso inadvertido da referência para modificar os elementos do contêiner. Se você precisar modificar apenas a variável de loop local, a cópia potencialmente cara será inevitável.