Ostrzeżenie C26820

Jest to potencjalnie kosztowna operacja kopiowania. Rozważ użycie odwołania, chyba że wymagana jest kopia (p.9)

Aby uzyskać więcej informacji, zobacz P.9: Nie marnuj czasu ani przestrzeni w podstawowych wytycznych dotyczących języka C++.

Ta kontrola obejmuje nieobjętne i łatwe do chybienia zachowanie podczas przypisywania odwołania do zmiennej oznaczonej jako auto. Typ zmiennej auto jest rozpoznawany jako wartość, a nie odwołanie, a niejawna kopia jest dokonana.

Uwagi

  • To ostrzeżenie nie jest wywoływane dla skalarów, inteligentnych wskaźników ani widoków. Nie jest on również zgłaszany dla typów, których rozmiar nie jest większy niż dwa razy większy niż rozmiar wskaźnika zależnego od platformy.

  • To ostrzeżenie nie jest zgłaszane, gdy zmienna zostaje zmutowana, ponieważ oznacza, że auto& wprowadza skutki uboczne mutacji.

  • To ostrzeżenie nie jest zgłaszane, gdy odwołanie pochodzi z obiektu tymczasowego, ponieważ powoduje to zwisające odwołanie. Przykład:

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

Przykład

W tym przykładzie przedstawiono definicję zmiennej, która tworzy potencjalnie kosztowną kopię w przypadku przypisania odwołania:

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

Aby rozwiązać ten problem, zadeklaruj zmienną przy użyciu polecenia const auto& :

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