Учитывая этот пример:
std::vector<int> v1 = { 1, 2, 3 };
const int* i = &v1[1];
std::vector<int> v2(std::move(v1));
std::cout << *i << std::endl;
Несмотря на то, что во многих реализациях STL это, вероятно, будет работать, гарантируется ли мне стандартом, что при перемещении std::vector
не выполняется перераспределение, а внутренний буфер, поддерживающий v2
, такой же, как и у v1
? Мне не удалось найти эту информацию ни в Интернете, ни в самом стандарте.
X(rv)
, т.е. создание контейнера из rvalue, должно иметь постоянную сложность (в отличие от линейной для создания копии), я думаю, мы можем сделать вывод из этого элементы должны находиться в одних и тех же ячейках памяти после перемещения. Однако из этого не обязательно следует, что итераторы остаются действительными. - person M.M   schedule 17.08.2014std::vector<int> v2; v2.swap(v1);
, то это, безусловно, так. (23.2.1/10) - person zch   schedule 17.08.2014array
) не делает недействительными любые ссылки, указатели или итераторы, ссылающиеся на элементы исходного контейнера. - person dyp   schedule 17.08.2014