Bagikan melalui


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, , , cleanresetfree, destroy, , , releasedeallocassign
  • 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
}