Будет понятно, если мы напишем семантически равный код без std::vector
:
B* pre = new B[2]; // Declare std::vector<B> and allocate some space to make the following line correct
B[0] = 1; // pre.push_back(B(1));
B[1] = 2; // pre.push_back(B(2));
B* post = pre; // std::vector<B> post(std::move(pre));
На самом деле, перемещение вектора сводится к копированию указателя без перераспределения.Данные, на которые указывает указатель, остаются на своем месте, поэтому адреса векторных элементов не меняются.
В этом примере кода после четвертой строки и pre
, и post
указывают на одни и те же данные с одинаковымиaddress.
std::vector
- это оболочка для указателя на массив с некоторыми дополнительными функциями.Таким образом, после выполнения std::vector<B> post(std::move(pre));
, post
будет содержать указатель с тем же значением, которое было в pre
.