경고 C26800

개체에서 이동한 'object'를 사용합니다.

설명

변수가 이동된 후 사용되는 경우 경고 C26800이 트리거됩니다. 변수는 함수에 rvalue 참조로 전달된 후 이동된 것으로 간주됩니다. 할당, 소멸 및 일부 상태 재설정 함수(예: std::vector::clear.)에 대한 몇 가지 예외가 있습니다. 상태 재설정 함수를 사용한 후에는 변수를 자유롭게 사용할 수 있습니다. 이 검사 지역 변수에 대한 이유만 있습니다.

다음 메서드는 상태 재설정 메서드로 간주됩니다.

  • 이름에 대/소문자를 구분하지 않는 부분 문자열이 있는 함수: clear,, cleanreset, freedestroy, , deallocreleaseassign
  • 오버로드된 할당 연산자, 소멸자

이 검사 작업을 존중합니다.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
}