我浏览了这个 页面,但我无法得到同样的原因。那里提到
“更明智的做法是不返回任何值并要求客户端使用 front() 来检查队列前面的值”
但是从 front() 中检查元素也需要将该元素复制到左值中。例如在这个代码段中
std::queue<int> myqueue;
int myint;
int result;
std::cin >> myint;
myqueue.push (myint);
/* here temporary will be created on RHS which will be assigned to
result, and in case if returns by reference then result will be
rendered invalid after pop operation */
result = myqueue.front(); //result.
std::cout << ' ' << result;
myqueue.pop();
在第五行 cout 对象首先创建 myqueue.front() 的副本,然后将其分配给结果。那么,有什么区别,pop 函数可以做同样的事情。
原文由 cbinder 发布,翻译遵循 CC BY-SA 4.0 许可协议
它确实可以做同样的事情。它没有这样做的原因是,返回弹出元素的弹出在存在异常的情况下是不安全的(必须按值返回并因此创建副本)。
考虑这种情况(用一个天真的/虚构的流行实现来说明我的观点):
如果 T 的复制构造函数在返回时抛出,则您已经更改了队列的状态(在我的幼稚实现中为
top_position
)并且该元素已从队列中删除(并且不返回)。对于所有意图和目的(无论您如何在客户端代码中捕获异常),队列顶部的元素都会丢失。在不需要弹出值的情况下,这种实现也是低效的(即它创建了没有人会使用的元素的副本)。
这可以通过两个单独的操作(
void pop
和const T& front()
)安全有效地实现。