Peringatan C26800
Penggunaan yang dipindahkan dari objek: 'objek'.
Keterangan
Peringatan C26800 dipicu ketika variabel digunakan setelah dipindahkan. Variabel dianggap dipindahkan dari setelah diteruskan ke fungsi sebagai referensi rvalue. Ada beberapa pengecualian untuk penugasan, penghancuran, dan beberapa fungsi pengaturan ulang status seperti std::vector::clear
. Setelah menggunakan fungsi reset status, kita bebas menggunakan variabel . Pemeriksaan ini hanya alasan tentang variabel lokal.
Metode berikut dianggap sebagai metode reset status:
- Fungsi dengan substring tidak peka huruf besar/kecil berikut dalam namanya:
clear
, , ,clean
reset
free
,destroy
, , ,release
dealloc
assign
- Operator penugasan yang kelebihan beban, destruktor
Pemeriksaan ini menghormati std::swap
operasi:
void f() {
Y y1, y2;
consume(std::move(y1));
std::swap(y1, y2);
y1.method(); // OK, valid after swap.
y2.method(); // warning C26800
}
Pemeriksaan ini juga mendukung try_emplace
operasi di STL yang secara kondisional memindahkan argumennya:
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.
}
}
Nama analisis kode: USE_OF_A_MOVED_FROM_OBJECT
Contoh
Kode berikut menghasilkan 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
}
Kode berikut tidak menghasilkan 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
}