You are using rvalue references incorrectly. Taking an argument by rvalue reference is not a very common thing to want to do. It does not say "I want to move from the argument" and it does not say "I want to later move from this parameter". Instead, it's a reference - nothing is copied or moved, it's just referenced. Inside the function, the expression func is an lvalue (because things that are named are lvalues), so the copy constructor will be called when initialising p with it.
What you should be doing instead is taking the argument by value:
void makeNew(std::function<void()> p) { // ... }
If you pass an rvalue to this function, it will be moved into the function. If you pass an lvalue, it will be copied. And look, now there's no need to have an extra std::function inside makeNew. Just use the argument itself! If you really need to move from the argument for some reason, then you could do:
void makeNew(std::function<void()> func) { std::function<void()> p = std::move(func); }
Using std::move turns the expression func (which is an lvalue) into an rvalue expression. Then it will be moved from. However, I can't see any good reason to need to do this unless you're moving into yet another function.
Of course, on the off chance that I'm completely wrong and you really do want to take an rvalue reference, if you want to move from it, you still need to do std::move.
funci an lvalue. You can use std::move to convert it to an rvalue, which may be moved from.