Warnung C26820

Dies ist ein potenziell kostspieliger Kopiervorgang. Erwägen Sie die Verwendung eines Verweises, es sei denn, eine Kopie ist erforderlich (p.9)

Weitere Informationen finden Sie unter P.9: Verschwenden Sie keine Zeit oder keinen Speicherplatz in den C++-Kernrichtlinien.

Bei dieser Überprüfung werden nichtobvious und leicht zu übersehende Verhaltensweisen behandelt, wenn ein Verweis auf eine Variable zugewiesen wird, die markiert ist auto. Der Typ der auto Variablen wird in einen Wert und nicht in einen Verweis aufgelöst, und eine implizite Kopie wird erstellt.

Hinweise

  • Diese Warnung wird für Skalare, intelligente Zeiger oder Ansichten nicht ausgelöst. Sie wird auch nicht für Typen ausgelöst, deren Größe nicht mehr als doppelt so hoch ist wie die plattformabhängige Zeigergröße.

  • Diese Warnung wird nicht ausgelöst, wenn die Variable stumm geschaltet wird, da die auto& Markierung Nebenwirkungen für die Mutation verursachen würde.

  • Diese Warnung wird nicht ausgelöst, wenn der Verweis von einem temporären Objekt stammt, da dies zu einem verzweifenden Verweis führt. Beispiel:

    std::optional<int> TryGetNumber();
    ...
    const auto& val = TryGetNumber().value();
    val++; // Temporary from TryGetNumber() is destroyed and val is now dangling
    

Beispiel

Dieses Beispiel zeigt eine Variabledefinition, die eine potenziell teure Kopie erstellt, wenn einem Verweis zugewiesen wird:

const Object& MyClass::getRef() { ... }
...
auto ref = myclass.getRef(); // C26820 (`ref` takes a copy of the returned object)

Um dieses Problem zu beheben, deklarieren Sie die Variable stattdessen mithilfe const auto& von:

const Object& MyClass::getRef() { ... }
...
const auto& ref = myclass.getRef(); // OK