Aracılığıyla paylaş


Uyarı C26800

Taşınan nesnenin kullanımı: 'object'.

Açıklamalar

Bir değişken taşındıktan sonra kullanıldığında C26800 uyarısı tetiklenir. Bir değişken, rvalue başvurusu olarak bir işleve geçirildikten sonra öğesinden taşınmış olarak kabul edilir. Atama, yok etme ve gibi std::vector::clearbazı durum sıfırlama işlevleri için bazı özel durumlar vardır. Durum sıfırlama işlevini kullandıktan sonra değişkenini kullanabiliriz. Bu yalnızca yerel değişkenlerle ilgili nedenleri denetler.

Aşağıdaki yöntemler durum sıfırlama yöntemleri olarak kabul edilir:

  • Adında aşağıdaki büyük/küçük harfe duyarlı olmayan alt dizeye sahip işlevler: clear, clean, reset, free, , destroy, release, dealloc, assign
  • Aşırı yüklenmiş atama işleçleri, yıkıcı

Bu denetim işlemi dikkate alır 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
}

Denetim, STL'de bağımsız değişkenini koşullu olarak taşıyabilen işlemleri de destekler try_emplace :

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.
  }
}

Kod analizi adı: USE_OF_A_MOVED_FROM_OBJECT

Örnekler

Aşağıdaki kod C26800 oluşturur.

#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
}

Aşağıdaki kod C26800 oluşturmaz.

#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
}