Class vector has two push_back implementations:
void push_back( const T& value );
void push_back( T&& value );
The first one does copy of the element given.
The second tries to "move" it by calling element's move constructor (if it's defined).
Using move forces to pick the second implementation which is supposed to reuse the value rather than just copying one.
In this particular case this is what gonna happen:
- Vector baris allocated on the stack, but its elements (42) are allocated on the heap.
- When you call foo.push_back(...),fooallocates on the heap a new vector, which is gonna bebars copy. Let's call itbaz:) Depending on whichpush_backimplementation is called the following will happen then:
- void push_back( const T& value );: in this case all- bar's elements will be copyed to- bazas well.
- void push_back( T&& value );in this case- bazwill receive a pointer to- bar's elements, so no copy operations are performed. But it is crucial for understanding that- barwill be deprived of its elemets (now- bazowns them), so- barshoun't be used after- move.
 
It isn't that important what kind of the elements are (plain ints or pcl::PointXYZ), since only the first vector has allocated the memory for the elements, and the pointer to that memory is the only thing that is copyed during the move call.