std :: vector, std :: move и указатель недействительности

Мой вопрос относится к следующей схеме …
Я хотел бы использовать следующий шаблон, чтобы построить дорогое, чтобы построить SomeData, а затем переместите его в UsesData,

Так что вопрос …

Указатели в ud.dat.m_ptrs гарантированно будет действительным?

struct BigObject{};
struct SomeData
{
SomeData() = default;

SomeData(const SomeData &) = delete;
SomeData & operator = (const SomeData &) = delete;

SomeData(SomeData &&) = default;
SomeData & operator = (SomeData &&) = default;

std::vector<BigObject> m_data1; // big vector
std::vector<BigObject> m_data2; // big vector

// (m_ptrs.size() == m_data1.size() + m_data2.size())
// points to elements in m_data1 and m_data2...
std::vector<const BigObject * const> m_ptrs;
};

struct Builder
{
Builder() = delete;
Builder(const Builder &) = delete;
Builder & operator=(const Builder &) = delete;
Builder(Builder &&) = delete;
Builder & operator=(Builder &&) = delete;

Builder(int a)
{
// makes sure BigObject vectors in SomeDate are constructed correctly
// builds m_ptrs... vector of ptrs to m_data1 and m_data2
}

SomeData dat;
};

struct UsesData
{
UsesData() = delete;
UsesData(const UsesData &) = delete;
UsesData & operator=(const UsesData &) = delete;
UsesData(UsesData &&) = delete;
UsesData & operator=(UsesData &&) = delete;

UsesData(Builder && from) : dat{ std::move(from.dat) }
{}

const SomeData dat;
};

int main()
{
UsesData ud{ Builder{ 1 } };
//...
}

1

Решение

Указатели останутся действительными. По поведению переместить конструктор из std::vector:

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

Это означает, что после перемещения указатели остаются действительными и указывают на элементы, которые были перемещены в новый std::vector,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]