Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Potentiellt dyr kopia av variabelnamn i range-for-loop. Överväg att göra det till en const-referens (es.71).
Anmärkningar
För mer information, se ES.71: Föredra ett rang-for-uttryck framför ett for-uttryck när det finns ett val i C++ Core Guidelines.
Exempel
Om en intervall-för-loop-variabel inte uttryckligen markeras som en referens, hämtar den en kopia av varje element som itereras över:
#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
// ...
}
}
Varningen ignorerar vissa typer som är billiga att kopiera som för skalärer (pekare, aritmetiska typer och så vidare).
Om loopvariabeln inte är muterad någonstans i loopen gör du det till en const-referens för att åtgärda problemet:
#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
// ...
}
}
Nyckelordet const gör loopvariabeln oföränderlig. Användning av en icke-const-referens gör det möjligt att oavsiktligt använda referensen för att ändra containerns element. Om du bara behöver ändra variabeln för den lokala loopen är den potentiellt dyra kopieringen oundviklig.