为什么即使在std :: queue的pop()之后,从front()返回的值仍然存在?

时间:2018-04-05 07:37:07

标签: c++ queue

我将从queue :: front()返回的值收集到局部变量中。根据文档,queue :: front()返回引用。 因此,如果我从队列中弹出它,收集的值如何仍然存在?

int main()
{
    std::string val;
    {
        std::queue<std::string> q;
        q.push("one");
        q.push("two");
        q.push("three");
        val = q.front();
        q.pop();
        q.pop();
        q.pop();
        std::cout << "is queue empty: " << boolalpha << q.empty() << '\n';
    }

    std::cout << "val: " << val << '\n';
}

输出结果为:

is queue empty: true
val: one

为什么 val 仍然有&#34;一个&#34;在 pop()&nbsp;

之后

1 个答案:

答案 0 :(得分:1)

因为val不是参考。不是在队列的前面或其他任何地方。

当你这样做时

val = q.front();

将当前位于队列前面的内容复制到val

稍后使用队列执行的操作不会影响此副本。

如果您需要参考,则需要val作为参考。

请记住,通过使val成为引用,它只会引用队列中的一个元素。弹出前面一次后,该引用变为无效。添加新元素不会改变你的引用,它仍会引用队列中的相同元素,它不会引用新的前面。一旦绑定,你就无法重新绑定引用。

总而言之,使用对队列中元素的引用在大多数用例中都是无用的。