Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Mogelijk dure kopie van variabele naam in een range-for-lus. Overweeg het een const-verwijzing te maken (es.71).
Opmerkingen
Zie ES.71 voor meer informatie: Geef de voorkeur aan een bereik-uitdrukkingfor boven een for-uitdrukking wanneer er een keuze is in de C++ Core Guidelines.
Voorbeeld
Als een variabele in een bereik-lus niet expliciet als verwijzing is gemarkeerd, krijgt het een kopie van elk element waarover wordt geïtereerd.
#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
// ...
}
}
De waarschuwing negeert sommige typen die goedkoop zijn om te kopiëren, zoals voor scalaire waarden (aanwijzers, rekenkundige typen, enzovoort).
Om dit probleem op te lossen, zet u de lusvariabele om naar een constante verwijzing als deze nergens in de lus wordt aangepast.
#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
// ...
}
}
Het const trefwoord maakt de lusvariabele onveranderbaar. Gebruik van een niet-const-verwijzing maakt het mogelijk om per ongeluk de verwijzing te gebruiken om de elementen van de container te wijzigen. Als u alleen de lokale lusvariabele wilt wijzigen, is de potentieel dure kopieeractie onvermijdelijk.