Megosztás a következőn keresztül:


Figyelmeztetés C26820

Ez egy potenciálisan költséges másolási művelet. Ha nincs szükség másolatra, fontolja meg a hivatkozás használatát (p.9)

További információért lásd a P.9: Ne pazarolja az időt vagy a helyet részt a C++ irányelvek vezérfonalában.

Ez az ellenőrzés a nem látható és könnyen kihagyható viselkedést mutatja be, amikor hivatkozásokat rendel egy megjelölt autováltozóhoz. A auto változó típusa értékké, nem hivatkozássá oldódik fel, és implicit másolat készül.

Megjegyzések

  • Ez a figyelmeztetés nem skalároknál, intelligens mutatóknál vagy nézeteknél fordul elő. Olyan típusok esetében sem alkalmazzák, amelyek mérete nem haladja meg a platformfüggő mutató méretének kétszeresét.

  • Ez a figyelmeztetés nem jelenik meg, amikor a változó mutánssá válik, mivel a megjelölés auto& mellékhatásokat okozna a mutációban.

  • Ez a figyelmeztetés nem jelenik meg, ha a hivatkozás egy ideiglenes objektumból származik, mert az egy csonkoló hivatkozást eredményez. Például:

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

példa

Ez a példa azt mutatja be, hogy egy változódefiníció hivatkozás hozzárendelésekor potenciálisan költséges másolatot készít.

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

A probléma megoldásához deklarálja a változót a következővel const auto& :

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