Я просматриваю некоторый код, подобный этому, где A
является подвижным типом:
// Returns true exactly when ownership of a is taken
bool MaybeConsume(A&& a) {
if (some condition) {
Consume(std::move(a)); // ???
return true;
}
return false;
}
// ... elsewhere ...
A a;
if (!MaybeConsume(std::move(a))) {
a.DoSomething(); // !!!
}
Наш инструмент статического анализа жалуется, что используется после перемещения (на a
!!!
). IIUC std::move
- это только static_cast
, и объект a
фактически не будет портиться до тех пор, пока не будет вызван конструктор перемещения или оператор присваивания (предположительно в Consume
). Предполагая, что MaybeConsume
удовлетворяет контракту в комментарии,
- Это работает?
- Это UB?
- Является
std::move
at???
нет-op?
(Вероятно, этот конкретный экземпляр можно реорганизовать, чтобы избежать тонкости, но я все равно хотел бы попросить мое собственное понимание).