Share via


警告 C26800

使用從物件移動的 : ' object '。

備註

當變數從移動之後,就會觸發警告 C26800。 變數在傳遞至函式做為右值參考之後,會將其視為從中移除。 指派、解構和某些狀態重設函式有一些例外狀況,例如 std::vector::clear 。 使用狀態重設函式之後,我們可以使用 變數。 此檢查只會檢查區域變數的相關原因。

下列方法會被視為狀態重設方法:

  • 名稱中具有下列不區分大小寫子字串的函式: clear 、、 cleanreset 、、 freedestroyrelease 、、 deallocassign
  • 多載指派運算子,解構函式

這項檢查會 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
}