调用pop()后为什么top()的返回值会发生变化?

时间:2016-11-12 12:25:09

标签: c++ auto const-reference

调用priority_queue后,top()的{​​{1}}返回的const引用发生了变化(visual studio 2015)

pop()

如果按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();

这背后有什么机制?

1 个答案:

答案 0 :(得分:1)

  

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

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

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

  

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

top的值会被存储到m一次,之后就不会更改。