为什么在调用 pop() 后 top() 的 return 值发生变化?

Why does top()'s return value change after calling pop()?

priority_queuetop() 返回的 const 引用在调用 pop() 后发生变化(visual studio 2015)

priority_queue<int> queue;
queue.push(1);
queue.push(2);
queue.push(3);

const int & m = queue.top();
cout << m << endl; // 3
queue.pop();
cout << m << endl; // 2
queue.pop();
cout << m << endl; // 1

如果通过 auto & m = queue.top(); 获得最高值,则输出也为 3 2 1

而如果通过 auto m = queue.top(); 获得最高值,则输出为 3 3 3

这背后的机制是什么?

If get top value by auto & m = queue.top();, then output is also 3 2 1.

尽管它在第一次 pop() 调用后调用未定义的行为来使用 m,下一个值很可能被移动到那个悬空引用(地址)。这是因为 std::priority_queue 的默认基础类型是 std::vector,它保证了元素数组的连续性。

但是如前所述,行为是未定义的,并且不能保证使用不同的编译器重现该结果。

While if get top value by auto m = queue.top();, then output is 3 3 3.

来自 top 的值只存储到 m 一次,之后就再也没有改变过。