Avertissement C26820
Il s’agit d’une opération de copie potentiellement coûteuse. Envisagez d’utiliser une référence, sauf si une copie est requise (p.9)
Pour plus d’informations, consultez P.9 : Ne perdez pas de temps ni d’espace dans les instructions de base C++.
Cette case activée couvre le comportement nonobvieux et facile à manquer lors de l’affectation d’une référence à une variable marquée auto
. Le type de la auto
variable est résolu en une valeur plutôt qu’une référence, et une copie implicite est effectuée.
Notes
Cet avertissement n’est pas déclenché pour les scalaires, les pointeurs intelligents ou les vues. Il n’est pas non plus élevé pour les types dont la taille n’est pas supérieure à deux fois la taille du pointeur dépendant de la plateforme.
Cet avertissement n’est pas déclenché lorsque la variable est mutée, car elle
auto&
introduit des effets secondaires à la mutation.Cet avertissement n’est pas déclenché lorsque la référence provient d’un objet temporaire, car cela entraîne une référence déanglante. Par exemple :
std::optional<int> TryGetNumber(); ... const auto& val = TryGetNumber().value(); val++; // Temporary from TryGetNumber() is destroyed and val is now dangling
Exemple
Cet exemple montre une définition de variable qui rend une copie potentiellement coûteuse lors de l’affectation d’une référence :
const Object& MyClass::getRef() { ... }
...
auto ref = myclass.getRef(); // C26820 (`ref` takes a copy of the returned object)
Pour résoudre ce problème, déclarez la variable à l’aide const auto&
de :
const Object& MyClass::getRef() { ... }
...
const auto& ref = myclass.getRef(); // OK