Почему возвращаемое значение top() изменяется после вызова pop()?

Ссылка const, возвращаемая priority_queue"s top() меняется после звонка pop() (визуальная студия 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,

Какой механизм стоит за этим?

1 ответ

Решение

Если получить максимальное значение по auto & m = queue.top();, то вывод тоже 3 2 1,

Несмотря на это вызывает неопределенное поведение, чтобы использовать m после 1-го pop() вызов, вполне вероятно, что следующее значение перемещается в эту висячую ссылку (адрес). Это потому, что базовый тип по умолчанию std::priority_queue является std::vector, что гарантирует непрерывный массив элементов.

Но, как уже упоминалось, поведение не определено, и нет никаких гарантий воспроизвести этот результат с другим компилятором.

Хотя, если получить максимальное значение по auto m = queue.top(); тогда вывод 3 3 3,

Значение из top хранится в m один раз и никогда не менялся потом.

Другие вопросы по тегам