Предупреждение C26800
Использование перемещаемого из объекта: "object".
Замечания
Предупреждение C26800 активируется при использовании переменной после перемещения из нее. Переменная считается перемещенной после того, как она передается функции в качестве ссылки rvalue. Существуют некоторые исключения для назначения, уничтожения и некоторых функций сброса состояния, таких как 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
}
Проверка также поддерживает 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
}