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