次の方法で共有


警告 C26800

移動されたオブジェクトの使用: 'object'。

解説

警告 C26800 は、変数が移動後に使用されるとトリガーされます。 変数は、右辺値参照として関数に渡された後から移動されたと見なされます。 割り当て、破棄、および状態リセット関数 std::vector::clearにはいくつかの例外があります。 状態リセット関数を使用した後は、変数を自由に使用できます。 このチェックローカル変数に関する理由だけです。

次のメソッドは、状態リセットメソッドと見なされます。

  • 名前に大文字と小文字を区別しない部分文字列を含む関数: clear, , , reset, free, destroyrelease, dealloccleanassign
  • オーバーロードされた代入演算子、デストラクター

このチェックでは、操作が考慮されます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
}