в std::list
Повторил данный код на простом примере, не работает:
Tmp *tmp = new Tmp;
auto array = new Tmp[10];
array[0] = *tmp;
tmp->counter++;
tmp->counter++;
->
tmp.counter == 2
array[0].counter == 0
Может необходимо хранить массив указателей, чтобы сохранить данную возможность?
у вас тут нет никаких ссылок
array[0] = *tmp; это присвоение копии
спасибо, получилось в обратном порядке std::list<Tmp> list;; list.push_back(*(new Tmp)); Tmp *tmp = &list.back();
list.push_back(*(new Tmp)); Максимально странное действие
это для примера просто, делал копипастом
Опасаюсь спрашивать, откуда.
Ну это мгновенная утечка
В с++ нет массива ссылок. Нужно делать массив указателей. Но настоятельно рекомендую делать массив unique_ptr
спасибо, я вообще на std::list всё делаю, это так, для упрощения показать хотел за unique_ptr подход не знал, возьму на вооружение
https://en.cppreference.com/w/cpp/utility/functional/reference_wrapper Вот так это можно обойти, если прямо нужно
It is frequently used as a mechanism to store references inside standard containers (like std::vector) which cannot normally hold references. прям то что доктор прописал
Ещё можно порекомендовать плотно подумать, точно ли вам нужен list, а не vector.
но надо понимать последствия - если ссылка "провиснет", то можно об этом и не узнать
человеку стабильность ссылок нужна, как я понял. так что видимо list либо deque (с deque нюансы есть)
Если так, то да.
по итогу проверил мой код (который писал чуть ранее, с std::list, не этот упрощённый) на убунте с g++, всё работает у меня на clang 1 в 1 код, абсолютно идентичный не работает с g++ на убунте по указателю объект модифицируется и в сохранённом свойстве и в списке, а с cland на макоси - только сохранённое свойство, в списке изменение не проходит
Обсуждают сегодня