2016-11-12 7 views
-2

auto & m = queue.top();하여 상위 값을 얻으면 pop() (비주얼 스튜디오 2015)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 

호출 후 priority_queuetop() 변경하여 반환 CONST 참조는 다음과 같은 출력 3 2 1이다.

위로 가기 값이 auto m = queue.top(); 인 경우 출력은 3 3 3입니다.

어떤 메커니즘이 뒤에 있습니까?

+4

정의되지 않은 동작으로, 더 이상 존재하지 않는 요소에 대한 참조가 생성되었습니다. –

+0

이것이 왜 downvoted인지 확실하지 않은 것 같습니다. 공정한 질문처럼 보입니다. –

답변

1

최대 값이 auto & m = queue.top(); 인 경우 출력도 3 2 1입니다.

는 1 pop() 호출 후 m를 사용하는 정의되지 않은 동작을 호출에도 불구하고, 다음 값이 매달려 참조 (주소)로 이동 가능성이 높습니다. std::priority_queue의 기본 기본 형식이 std::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)에서 그것은 _ "... 우선 순위 큐의 최상위 요소에 대한 참조를 반환합니다.이 요소는 pop() 호출시 제거됩니다."_ –

+1

@stanleyerror 참조가 prvalue에 바인딩 될 때 생각하고 있습니다. 그러나'top()'은 값 (prvalue)이 아닌 lvalue를 반환합니다 (값으로 사용하는 것이 아니라 참조로 반환하는 또 다른 방법). 일시적인 문제는 없습니다. –