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::clear
ad 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
,free
reset
clean
destroy
release
,dealloc
assign
- 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
}
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per