int main() { { std::unique_ptr<B> bptr(new B); std::unique_ptr<A> aptr(new A); testAssign(aptr, bptr); } assert(A::count == 0); assert(B::count == 0); { Deleter<B> del(42); std::unique_ptr<B, Deleter<B> > bptr(new B, std::move(del)); std::unique_ptr<A, Deleter<A> > aptr(new A); testAssign(aptr, bptr); checkDeleter(aptr, bptr, 42, 0); } assert(A::count == 0); assert(B::count == 0); { CDeleter<A> adel(6); CDeleter<B> bdel(42); std::unique_ptr<B, CDeleter<B>&> bptr(new B, bdel); std::unique_ptr<A, CDeleter<A>&> aptr(new A, adel); testAssign(aptr, bptr); checkDeleter(aptr, bptr, 42, 42); } assert(A::count == 0); assert(B::count == 0); }
void testMoveConvertImplicit(Deleter&& del) { #else void testMoveConvertImplicit(Deleter& del) { #endif int old_val = del.state(); { // Test Implicit constructor BPtr s(new B, std::forward<Deleter>(del)); A* p = s.get(); APtr s2 = std::move(s); assert(s2.get() == p); assert(s.get() == 0); checkDeleter(s, s2, del.state(), old_val); assert(A::count == 1); assert(B::count == 1); } assert(A::count == 0); assert(B::count == 0); }