警告 C26800
使用從物件移動的 : ' object '。
備註
當變數從移動之後,就會觸發警告 C26800。 變數在傳遞至函式做為右值參考之後,會將其視為從中移除。 指派、解構和某些狀態重設函式有一些例外狀況,例如 std::vector::clear
。 使用狀態重設函式之後,我們可以使用 變數。 此檢查只會檢查區域變數的相關原因。
下列方法會被視為狀態重設方法:
- 名稱中具有下列不區分大小寫子字串的函式:
clear
、、clean
reset
、、free
、destroy
、release
、、dealloc
assign
- 多載指派運算子,解構函式
這項檢查會 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
}
此檢查也支援 try_emplace
STL 中有條件地移動其引數的作業:
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.
}
}
程式碼分析名稱: USE_OF_A_MOVED_FROM_OBJECT
範例
下列程式碼會產生 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
}
下列程式碼不會產生 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
}