Я просматриваю некоторый код, подобный этому, где 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::moveat???нет-op?
(Вероятно, этот конкретный экземпляр можно реорганизовать, чтобы избежать тонкости, но я все равно хотел бы попросить мое собственное понимание).