std :: queue front会将前端元素排除在外吗?

Rel*_*lla 4 c++ queue std

std::queue::front前线元素排除在外?如果不是如何删除它?

Ale*_* C. 9

有一个获取元素的函数,另一个用于删除它:

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));
Run Code Online (Sandbox Code Playgroud)

基本原理:如果只有一个pop函数返回前面的元素,则不可能获得对前面元素的引用,因为它已经从队列中删除了.如果您只是想在丢弃它之前阅读一个巨大的元素,那么您肯定不希望您的代码执行复制.

编辑:一个更基本的原因是拥有两个函数意味着用户负责制作副本.假设只有一个pop函数:如果复制构造函数(内部pop)抛出异常会发生什么?(参见@Steve Jessop的评论)

  • ...即使您确实想要复制,也无法在提供强大的异常保证的同时按价值返回.在将对象从队列中删除之后,将复制到调用者的左值*,因此如果复制ctor或复制赋值(在该特定情况下是其中的任何一个)抛出异常,则队列已经弹出. (2认同)