Condividi tramite


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