Класс vector
имеет две push_back
реализации:
void push_back( const T& value );
void push_back( T&& value );
Первый делает копию данного элемента.
Второй пытается «переместить» его, вызвав конструктор перемещения элемента (если он определен).
Использование move
заставляет выбрать вторую реализацию, которая должна повторно использовать значение, а не просто копировать его.
В данном конкретном случае это произойдет:
- Вектор
bar
размещается в стеке, но его элементы (42) размещаются в куче.
- Когда вы звоните
foo.push_back(...)
, foo
выделяет в куче новый вектор, который будет bar
с копией. Давайте назовем это baz
:) В зависимости от того, какая реализация push_back
вызвана, тогда произойдет следующее:
void push_back( const T& value );
: в этом случае все элементы bar
будут скопированы также в baz
.
void push_back( T&& value );
в этом случае baz
получит указатель на элементы bar
, поэтому операции копирования не выполняются. Но важно понимать, что bar
будет лишен своих элементов (теперь baz
владеет ими), поэтому bar
не должно использоваться после move
.
Не так важно, что это за элементы (простые целые или pcl::PointXYZ
), так как только первый вектор выделил память для элементов, и указатель на эту память - единственное, что копируется во время move
звонка.