Avviso C26820
Si tratta di un'operazione di copia potenzialmente costosa. Prendere in considerazione l'uso di un riferimento a meno che non sia necessaria una copia (p.9)
Per altre informazioni, vedere P.9: Non perdere tempo o spazio nelle linee guida di base di C++.
Questo controllo illustra il comportamento nonobvious e easy-to-miss quando si assegna un riferimento a una variabile contrassegnata come auto
. Il tipo della auto
variabile viene risolto in un valore anziché in un riferimento e viene eseguita una copia implicita.
Osservazioni:
Questo avviso non viene generato per scalari, puntatori intelligenti o visualizzazioni. Non viene inoltre generato per i tipi le cui dimensioni non sono maggiori del doppio delle dimensioni del puntatore dipendente dalla piattaforma.
Questo avviso non viene generato quando la variabile viene modificata, perché contrassegnandolo
auto&
introduce effetti collaterali alla mutazione.Questo avviso non viene generato quando il riferimento proviene da un oggetto temporaneo, perché genera un riferimento incerto. Ad esempio:
std::optional<int> TryGetNumber(); ... const auto& val = TryGetNumber().value(); val++; // Temporary from TryGetNumber() is destroyed and val is now dangling
Esempio
Questo esempio mostra una definizione di variabile che crea una copia potenzialmente costosa quando viene assegnato un riferimento:
const Object& MyClass::getRef() { ... }
...
auto ref = myclass.getRef(); // C26820 (`ref` takes a copy of the returned object)
Per risolvere questo problema, dichiarare la variabile usando const auto&
invece:
const Object& MyClass::getRef() { ... }
...
const auto& ref = myclass.getRef(); // OK