警告 C26800
移動されたオブジェクト 'object' の使用。
解説
警告 C26800 は、変数が移動後に使用されるとトリガーされます。 変数は、右辺値参照として関数に渡された後から移動されたと見なされます。 割り当て、破棄、および std::vector::clear
などの一部の状態リセット関数には、いくつかの例外があります。 状態リセット関数を使用した後は、変数を自由に使用できます。 このチェックは、ローカル変数に関する理由のみを確認します。
次のメソッドは、状態リセットメソッドと見なされます。
- 名前に大文字と小文字を区別しない部分文字列を含む関数:
clear
、clean
、reset
、free
、destroy
、release
、dealloc
、assign
- オーバーロードされた代入演算子、デストラクター
このチェックでは、 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
}
このチェックでは、条件付きで引数を移動する STL の 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.
}
}
コード分析名: 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
}