Является ли передний адрес std::vector перемещением инвариантным?

В следующем фрагменте:

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,

1 ответ

Решение

С cppreference.com:

После построения перемещения контейнера (overload (6)) ссылки, указатели и итераторы (кроме конечного итератора) на другие остаются действительными, но ссылаются на элементы, которые теперь находятся в *this. Нынешний стандарт дает эту гарантию с помощью бланкетного заявления в §23.2.1[container.requirements.general]/12, и через LWG 2321 рассматривается более прямая гарантия.

Указатели на элементы не становятся недействительными, включая указатели на первый элемент.

Другие вопросы по тегам