Как обычно правильно пересылать std::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
для объекта и доступ к нему для предоставления параметра для одного и того же вызова функции может быть распространенной ошибкой.
std::move
на самом деле не выполняет перемещение, аp->x
не обращается кp
после перемещения. - person Konrad Rudolph   schedule 27.01.2016transform2
будет выполнять построение перемещения. В этот моментp
вtransform1
пусто. Помните: компиляторы могут изменить порядок этих выражений так, как они считают нужным. - person Nicol Bolas   schedule 27.01.2016std::move(p)
ничего не делает, оно просто меняет статический тип выражения. Тем не менее, вы можете быть правы, потому что я не знаю, в какой именно момент времени происходит инициализация параметра; Я думал, что это произошло после вычисления всех выражений параметров, но понятия не имею. - person Konrad Rudolph   schedule 27.01.2016p->x
отдельно, если вы все равно передаете весь объект? - person Jonathan Potter   schedule 27.01.2016transform2
можно использовать со значением, отличным отp->x
;transform2
— умножение общего назначения,transform1
— специализация, которая возводит в квадрат. - person ShadowRanger   schedule 27.01.2016std::move
не приводит к тому, что последующее использование этого объекта становится UB. Напротив, следующий код полностью соответствует стандарту:auto&& q = std::move(p); p->x;
. У вас неправильное представление о том, чем занимаетсяstd::move
. - person Konrad Rudolph   schedule 27.01.2016std::move
! - person Konrad Rudolph   schedule 27.01.2016p
после того, как произойдет построение перемещения параметра функции. - person David Schwartz   schedule 27.01.2016