2016-11-12 5 views
-2

pop()(Visual Studioの2015)を呼び出した後priority_queuetop()変化によって返さconst参照pop()を呼び出した後にtop()の戻り値が変化するのはなぜですか?

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

定義されていない動作により、存在しなくなった要素への参照が作成されました。 –

+0

なぜこれがdownvotedされているのか分かりません。十分な質問のようです。 –

答えて

1

最大値がauto & m = queue.top();の場合、出力も3 2 1です。

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

しかし、その動作は定義されておらず、その結果を別のコンパイラで再現する保証はありません。

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

topの値は、mに一度格納され、その後は変更されません。

+0

なぜ、const参照 'm'が戻り値の寿命を延ばすのでしょうか? (戻り値の型はint型ではなく 'const int型'であるから) – stanleyerror

+0

@stanleyerror [documentation](http://en.cppreference.com/w/cpp/container/priority_queue/top) "... priority queueの先頭の要素への参照を返します。この要素はpop()の呼び出しで削除されます。" _ –

+1

@stanleyerror参照がprvalueにバインドされていると思っています。しかし、 'top()'は左辺値ではなく、値によって返されます。一時的なものはありません。 –

関連する問題