ссылочный фронт и pop_front - PullRequest
5 голосов
/ 05 июня 2011

Это законно?:

Sample& sample = stack.front();
stack.pop_front();

Моя программа работает. Но класс Sample имеет boost::optional<boost::posix_time::ptime> xxx член, и после pop_front, is_initialized() возвращает false;

Ответы [ 3 ]

12 голосов
/ 05 июня 2011

Нет, это не законно.Вы должны взять копию объекта, то есть использовать

Sample sample = stack.front ()

Если вы используете std::vector, вызов pop_front перемещает элементы позади в местоположение, а ваши опорные точки - в другой элемент (ранее второй, теперь первый элемент.)

1 голос
/ 29 июня 2018

Если stack на основе std::deque.Точно такое же поведение для std::vector и std::list.

Из стандарта:

std :: deque :: pop_front :

Итераторы и ссылки на стертый элемент недействительны.Если элемент является последним элементом в контейнере, последний итератор также становится недействительным.Другие ссылки и итераторы не затрагиваются.

1 голос
/ 05 июня 2011

Нет, конечно нет. Как только вы удалите объект из коллекции, ваша ссылка не будет ссылаться на него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...