Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Copie potentiellement coûteuse du nom de variable dans la boucle range-for. Envisagez d’en faire une référence const (es.71).
Remarques
Pour plus d’informations, consultez ES.71 : Préférez une déclaration de type range-for-statement à une déclaration de type for-statement lorsqu’il y a un choix dans les lignes directrices de base C++.
Exemple
Si une variable de boucle range-for n’est pas explicitement marquée comme référence, elle obtient une copie de chaque élément itéré sur :
#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
// ...
}
}
L’avertissement ignore certains types qui sont bon marché à copier comme pour les scalaires (pointeurs, types arithmétiques, etc.).
Pour résoudre ce problème, si la variable de boucle n’est pas mutée n’importe où dans la boucle, faites-la référence 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
// ...
}
}
Le const mot clé rend la variable de boucle immuable. L’utilisation d’une référence non const permet d’utiliser par inadvertance la référence pour modifier les éléments du conteneur. Si vous devez modifier uniquement la variable de boucle locale, la copie potentiellement coûteuse est inévitable.