История изменений
Исправление 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. Выбрасывать исключение? Тоже дорого.
И так далее.