Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Cópia potencialmente dispendiosa da variável name no ciclo range-for. Considere torná-lo uma referência const (es.71).
Observações
Para obter mais informações, consulte ES.71: Prefira uma instrução de intervalo for em vez de uma instrução for quando houver uma opção nas Diretrizes Gerais do C++.
Exemplo
Se uma variável de loop range-for não estiver explicitamente marcada como referência, ela obterá uma cópia de cada elemento iterado sobre:
#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á a ignorar 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 estiver mutada em nenhum lugar do loop, torne-a uma referência 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
// ...
}
}
A const palavra-chave torna a variável loop imutável. A utilização de uma referência não constante permite a utilização inadvertida da referência para modificar os elementos do contentor. Se precisar de modificar apenas a variável do laço local, a cópia potencialmente dispendiosa é inevitável.