Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Verwendung eines verschobenen objekts: 'object'.
Hinweise
Warnung C26800 wird ausgelöst, wenn eine Variable verwendet wird, nachdem sie verschoben wurde. Eine Variable wird nach dem Übergeben an eine Funktion als Rvalue-Bezug betrachtet. Es gibt einige Ausnahmen für zuordnungs-, zerstörungs- und einige Zustandsrücksetzungsfunktionen, z std::vector::clear. B. . Nach der Verwendung einer Zustandsrücksetzungsfunktion können wir die Variable verwenden. Diese Überprüfung betrifft nur die lokalen Variablen.
Die folgenden Methoden gelten als Zustandsrücksetzungsmethoden:
- Funktionen mit der folgenden Unterzeichenfolge ohne Groß-/Kleinschreibung in ihrem Namen:
clear, , ,reset,free,destroy,releasedealloccleanassign - Überladene Zuordnungsoperatoren, Destruktor
Diese Überprüfung berücksichtigt den std::swap Vorgang:
void f() {
Y y1, y2;
consume(std::move(y1));
std::swap(y1, y2);
y1.method(); // OK, valid after swap.
y2.method(); // warning C26800
}
Die Überprüfung unterstützt auch die try_emplace Vorgänge in STL, die das Argument bedingt verschieben:
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.
}
}
Name der Codeanalyse: USE_OF_A_MOVED_FROM_OBJECT
Beispiele
Der folgende Code generiert 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
}
Der folgende Code generiert nicht 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
}