Sdílet prostřednictvím


Upozornění C26800

Použití přesunutého objektu: "object".

Poznámky

Upozornění C26800 se aktivuje, když se po přesunutí proměnné použije. Proměnná se považuje za přesunutou od předání do funkce jako odkazu na hodnotu rvalue. Existují některé výjimky pro přiřazení, zničení a některé funkce resetování stavu, například std::vector::clear. Po použití funkce resetování stavu můžeme proměnnou použít. Tato kontrola kontroluje pouze důvody místních proměnných.

Následující metody jsou považovány za metody resetování stavu:

  • Funkce s následujícím podřetězením nerozlišující malá a velká písmena ve svém názvu: clear, clean, reset, free, destroy, release, deallocassign
  • Přetížené operátory přiřazení, destruktor

Tato kontrola respektuje std::swap operaci:

void f() {
    Y y1, y2;
    consume(std::move(y1));
    std::swap(y1, y2);
    y1.method();                  // OK, valid after swap.
    y2.method();                  // warning C26800
}

Kontrola také podporuje try_emplace operace v STL, které podmíněně přesunují svůj argument:

int g() {
  std::map<int, Y> m;
  Y val;
  auto emplRes = m.try_emplace(1, std::move(val));
  if (!emplRes.second) {
    val.method();  // No C26800, val was not moved because the insertion did not happen.
  }
}

Název analýzy kódu: USE_OF_A_MOVED_FROM_OBJECT

Příklady

Následující kód vygeneruje C26800.

#include <utility>

struct X {
    X();
    X(const X&);
    X(X&&);
    X &operator=(X&);
    X &operator=(X&&);
    ~X();
};

template<typename T>
void use_cref(const T&);

void test() {
    X x1;
    X x2 = std::move(x1);
    use_cref(x1);                // warning C26800
}

Následující kód negeneruje C26800.

#include <utility>

struct MoveOnly {
    MoveOnly();
    MoveOnly(MoveOnly&) = delete;
    MoveOnly(MoveOnly&&);
    MoveOnly &operator=(MoveOnly&) = delete;
    MoveOnly &operator=(MoveOnly&&);
    ~MoveOnly();
};

template<typename T>
void use(T);

void test() {
    MoveOnly x;
    use(std::move(x)); // no 26800
}