Что такое правильный способ перенаправления std :: unique_ptr?Как правильно переслать unique_ptr?
В следующем коде используется std::move
, который, как я думал, считается рассмотренной практикой, но он падает с clang.
class C {
int x;
}
unique_ptr<C> transform1(unique_ptr<C> p) {
return transform2(move(p), p->x); // <--- Oops! could access p after move construction takes place, compiler-dependant
}
unique_ptr<C> transform2(unique_ptr<C> p, int val) {
p->x *= val;
return p;
}
Есть более надежная, чем просто условность убедившись, что вы получите все, что вам нужно от p
до передачи права собственности на следующую функцию через std::move
? Мне кажется, что использование объекта move
и доступ к нему для обеспечения параметра для того же вызова функции может быть распространенной ошибкой.
Вы когда-нибудь рассматривали использование необработанных указателей? Это такие ситуации, когда так называемые «умные указатели» крайне непрактичны для использования. – Poriferous
Этот код определенно не должен сбой, по крайней мере, не по той причине, о которой вы говорите: 'std :: move' фактически не выполняет перемещение, а' p-> x' does * not * access 'p' после перемещения , –
@ KonradRudolph: Он все равно может потерпеть неудачу. Инициализация параметра 'transform2' * будет * выполнять конструкцию перемещения. В этот момент 'p' в' transform1' пуст. Помните: компиляторы могут переупорядочить эти выражения так, как они считают нужным. –