-2

呼び出し後priority_queueの変更によって返される const 参照(visual studio 2015)top()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();、出力は3 3 3です。

この背後にあるメカニズムは何ですか?

4

1 に答える 1

1

でトップ値を取得するauto & m = queue.top();と、出力も になり3 2 1ます。

m最初の呼び出しの後に使用する未定義の動作を呼び出しているにもかかわらずpop()、次の値がそのダングリング参照 (アドレス) に移動される可能性があります。これは、要素の連続した配列を保証するのデフォルトの基になる型std::priority_queueがであるためです。std::vector

ただし、前述のように、動作は未定義であり、別のコンパイラでその結果を再現する保証はありません。

でトップ値を取得する場合auto m = queue.top();、出力は3 3 3です。

からの値は一度にtop格納され、その後変更されることはありません。m

于 2016-11-12T12:34:06.620 に答える