Существует функция для получения элемента, другая для его удаления:
typedef queue<MyClass> MyQueue;
MyQueue q;
q.push(MyClass(42));
// ...
MyClass const& rx = q.front();
rx.print();
MyClass x = q.front(); // Copies the front element to a fresh object
q.pop(); // From this point, rx is a dangling reference
assert(x == MyClass(42));
Обоснование: если бы была только одна функция pop
, которая возвращает передний элемент, было бы невозможнополучить ссылку на передний элемент, так как он был бы удален из очереди.Если вы просто хотите прочитать огромный элемент перед его сбросом, вы, безусловно, не хотите, чтобы ваш код выполнял копирование.
РЕДАКТИРОВАТЬ: Еще одна фундаментальная причина заключается в том, что наличие двух функций означает, что пользователь несет ответственность заделая копию.Предположим, что есть только одна pop
функция: что произойдет, если конструктор копирования (внутри pop
) сгенерирует исключение?(см. комментарий Стива Джессопа)