Condividi tramite


Avviso C26800

Uso di un oggetto spostato dall'oggetto : 'object'.

Osservazioni:

L'avviso C26800 viene attivato quando viene usata una variabile dopo lo spostamento. Una variabile viene considerata spostata da dopo che viene passata a una funzione come riferimento rvalue. Esistono alcune eccezioni per l'assegnazione, la distruzione e alcune funzioni di reimpostazione dello stato, std::vector::clearad esempio . Dopo aver usato una funzione di reimpostazione dello stato, è possibile usare la variabile . Questo controllo controlla solo i motivi relativi alle variabili locali.

I metodi seguenti sono considerati metodi di reimpostazione dello stato:

  • Funzioni con la sottostringa senza distinzione tra maiuscole e minuscole seguenti nel nome: clear, freeresetcleandestroyrelease, deallocassign
  • Operatori di assegnazione in overload, distruttore

Questo controllo rispetta l'operazione std::swap :

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

Il controllo supporta anche le try_emplace operazioni in STL che spostano in modo condizionale il relativo argomento:

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.
  }
}

Nome dell'analisi del codice: USE_OF_A_MOVED_FROM_OBJECT

Esempi

Il codice seguente genera l'errore 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
}

Il codice seguente non genera 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
}