Является ли передний адрес 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:

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

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