В вашем коде:
A genesis = { "Parent", std::vector<A>() };
A l1 = { "Child1", std::vector<A>() };
A l2 = { "Child2", std::vector<A>() };
genesis .avector.push_back(l1);
genesis .avector.push_back(l2);
У вас есть 5 экземпляров. 3, которые вы объявляете, и 2 копии, которые у вас есть в вашем векторе.
Таким образом, более правильный (но возможно, ошибочный) способ сделать это будет:
A genesis = { "Parent", std::vector<A>() };
genesis .avector.emplace_back("Child1", std::vector<A>());
genesis .avector.emplace_back("Child2", std::vector<A>());
A& l1 = genesis.avector[0];
A& l2 = genesis.avector[1];
Теперь у вас есть только 3 экземпляра. l1 и l2 являются ссылками на элементы в векторе, поэтому изменения в них будут отражаться и в векторе.
Я сказал, что это возможно глючит. Когда вы изменяете вектор (добавляя что-то еще), ему, возможно, придется перераспределить, поэтому любые ваши ссылки будут недействительными, а результатом будет неопределенное поведение.
Если вам нужно изменить вектор, я бы сделал vector<unique_ptr<A>>
. Затем A& l1 = *genesis.avector[0]
, и это будет действовать до тех пор, пока элемент не будет удален из вектора.
Вы также можете попробовать std::reference_wrapper
вместо unique_ptr
, если хотите, чтобы объекты жили в стеке.
Я бы попытался избежать этого, так как более очевидно, что что-то разрушается при удалении из вектора, чем когда локальная переменная выходит из области видимости.