Although the existing answer provides a workaround using std::move that forces your program to compile, it must be said that using emplace_back seems to be based on a misunderstanding.
The way you describe it ("I tried [...] to move content from a vector to another using emplace_back() "), and the way you use it assumes that you think of emplace_back as a method of moving items in vector and push_back as a method for copying elements to a vector. The code you use to populate the first instance of the vector also offers this:
std::vector<obj> v; for( int i = 0; i < 1000; ++i ) { v.emplace_back(obj("Jon")); }
But it's not that the difference between emplace_back and push_back about equal.
Firstly, even push_back will move (not copy) elements to a vector if it is only set to r, and if the element type has a move assignment operator.
Secondly, the real use emplace_back for emplace_back is to build elements in place , i.e. you use it when you want to put objects in a vector that does not exist yet. The arguments emplace_back are arguments to the constructor of the object. So, your loop above should look like this:
std::vector<obj> v; for( int i = 0; i < 1000; ++i ) { v.emplace_back("Jon");
The reason your existing code works is because obj("Jon") also a valid argument for the constructor (in particular, for the move constructor). But the main idea of emplace_back is that you do not need to create an object and then move it. You do not use this idea when you pass it obj("Jon") instead of "Jon" .
On the other hand, in the second cycle, you are dealing with objects that were created earlier. It makes no sense to use emplace_back to move objects that already exist. Again, emplace_back applied to an existing object does not mean that the object has been moved. This means that it is created in place using the regular copy constructor (if one exists). If you want to move it, just use push_back applied to the result of std::move :
std::vector<obj> p; for( int i = 0; i < 1000; ++i ) { p.push_back(std::move(v[i]));
Additional notes
1) You can simplify the loop above by using the C ++ 11 range for:
std::vector<obj> p; for (auto &&obj : v) p.push_back(std::move(obj));
2) Regardless of whether you use the usual for-loop or range-based method, you move the elements one by one, which means that the source vector v will remain as a vector of 1000 empty objects. If you really want to clear the vector in the process (but still use the move semantics to transfer the elements to the new vector), you can use the move constructor of the vector itself:
std::vector<obj> p(std::move(v));
This reduces the second loop to one line and ensures that the original vector is deleted.