LINUX.ORG.RU

История изменений

Исправление Siborgium, (текущая версия) :

Потому что перед тем, как спрашивать, нужно подумать головой.

Пусть .pop возвращает… а что, собственно?

Если возвращать T, то на каждый .pop, даже немедленно отбрасывающий результат, необходимо произвести move (потенциально выбрасывающее исключение), а то и копирование объекта.

Если возвращать T*, то кто владеет указателем? Как его нужно освободить? delete, free, какой-то аллокатор? Что делать, если queue внутри использует deque, и элемент хранился в одном блоке памяти с другими элементами? Переаллоцировать?

Частично проблемы указателя снимаются заворачиванием в искусственный тип, а-ля queue_element, но тогда и вовсе невозможно использовать queue как адаптер.

Наконец, а что делать, если очередь пуста? Оборачивать в optional? Еще более дорого, чем просто T. Выбрасывать исключение? Тоже дорого.

И так далее.

А подход с .front и .pop оптимален, пользователь сам делает move/copy при необходимости сохранить объект в целости и сохранности, либо использует по месту.

Исходная версия Siborgium, :

Потому что перед тем, как спрашивать, нужно подумать головой.

Пусть .pop возвращает… а что, собственно?

Если возвращать T, то на каждый .pop, даже немедленно отбрасывающий результат, необходимо произвести move (потенциально выбрасывающее исключение), а то и копирование объекта.

Если возвращать T*, то кто владеет указателем? Как его нужно освободить? delete, free, какой-то аллокатор? Что делать, если queue внутри использует deque, и элемент хранился в одном блоке памяти с другими элементами? Переаллоцировать?

Частично проблемы указателя снимаются заворачиванием в искусственный тип, а-ля queue_element, но тогда и вовсе невозможно использовать queue как адаптер.

Наконец, а что делать, если очередь пуста? Оборачивать в optional? Еще более дорого, чем просто T. Выбрасывать исключение? Тоже дорого.

И так далее.