Изменить: мой плохой, вам нужно написать move(p)
внутри инициализатора. std::move
рассматривает все, что было дано, как ссылку на rvalue, и в вашем случае, даже если ваш аргумент является ссылкой rvalue на что-то, передача его чему-то другому (например, конструктору p_
) передаст ссылку lvalue, а не ссылку rvalue по умолчанию.
Комментарий Per Karu также добавил необходимые включения, чтобы сделать мой код компилируемым.
Например:
#include <memory>
#include <cassert>
#include <vector>
using namespace std;
class A {};
class B {
public:
void takeOwnershipOf(unique_ptr<A>&& rhs) {
// We need to explicitly cast rhs to an rvalue when passing it to push_back
// (otherwise it would be passed as an lvalue by default, no matter what
// qualifier it has in the argument list). When we do that, the move
// constructor of unique_ptr will take ownership of the pointed-to value
// inside rhs, thus making rhs point to nothing.
owned_objects.push_back(std::move(rhs));
}
private:
vector<unique_ptr<A>> owned_objects;
};
int main() {
unique_ptr<B> b(new B());
// we don't need to use std::move here, because the argument is an rvalue,
// so it will automatically be transformed into an rvalue reference.
b->takeOwnershipOf( unique_ptr<A>(new A()) );
unique_ptr<A> a (new A());
// a points to something
assert(a);
// however, here a is an lvalue (it can be assigned to). Thus we must use
// std::move to convert a into an rvalue reference.
b->takeOwnershipOf( std::move(a) );
// whatever a pointed to has now been moved; a doesn't own it anymore, so
// a points to 0.
assert(!a);
return 0;
}
Кроме того, в исходном примере вам следует переписать класс A следующим образом:
class A {
// takes ownership
A(unique_ptr
&& p): p_(std::move(p)) {}
unique_ptr<P> p_;
};
person
Dan
schedule
04.09.2011
boost::scoped_array
? - person rafak   schedule 11.06.2010std::unique_ptr
также работает с массивами (он вызывает delete []) - person Cubbi   schedule 11.06.2010std::unique_ptr<P[]>
. Не только unique_ptr вызовет delete [] при освобождении, но и отключает операторы * и - ›, а вместо этого предоставляет оператор []. - person deft_code   schedule 11.06.2010