В следующем фрагменте:
std::vector<double> a(100, 4.2);
auto* a_ptr = a.data();
auto b = std::move(a);
auto* b_ptr = b.data();
std::cout << ((b_ptr == a_ptr) ? "TRUE" : "FALSE") << '\n';
стандарт C ++ гарантирует, что b_ptr
всегда равно a_ptr
после std::move
? Запуск кода на wandbox печать TRUE
,
От cppreference.com :
После построения перемещения контейнера (overload (6)) ссылки, указатели и итераторы (кроме конечного итератора) на другие остаются действительными, но ссылаются на элементы, которые теперь находятся в * this. Текущий стандарт дает эту гарантию через бланкетное заявление в §23.2.1 [container.requirements.general] / 12, и более прямая гарантия рассматривается через LWG 2321.
Указатели на элементы не становятся недействительными, включая указатели на первый элемент.
Других решений пока нет …