2016-10-17 4 views
0

다음 스 니펫 foo이 유효한지, 즉 함수 반환 값을 const 참조로 저장할 수 있는지 여부가 확실하지 않은지 혼란 스럽습니까?함수의 반환 값에 대한 참조

반환 값이 스택 프레임에 저장되어 있기 때문에 물어 보는 중입니다. 값이 반환 된 직후 유효하지 않을 수 있습니다.

Foo getFoo() { 
    return Foo(); 
} 

void bar() { 
    const auto& foo = getFoo(); 

    // more function calls... 

    // is foo guaranteed to be valid? 
} 
+1

예, 유효합니다. –

+0

나는이 질문의 다른 측면을 강조하고 싶었다. 복제본과 허브 셔터의 링크로 표시된 것은 실제로 메모리 관점을 다루지 않습니다. 새로운 스택 프레임이 할당 될 때 참조 된 객체가 덮어 쓰여지지 않는 이유에 대해 궁금합니다. – user695652

+0

구현 정의 된 기능이라고 생각합니다. –

답변

1

그것은 유효한 C++는, 그러나 어떤 컴파일러 (예를 들어, 비주얼 스튜디오 2015, 내가 아는 한) 제대로를 구현하지 않는다는 점을 기억해주십시오.

표준 (N4140)에 따르면

12.2 임시 개체
....

4는 임시 변수가 아닌 다른 지점에서 파괴하는 두 가지 상황이있다 fullexpression의 끝. 첫 번째 컨텍스트는 배열의 요소를 초기화하기 위해 기본 생성자가 호출되는 경우입니다. 생성자에 하나 이상의 기본 인수가있는 경우 기본 배열 에 생성 된 모든 임시 요소의 삭제는 다음 배열 요소가 생성되기 전에 순서가 지정됩니다.

두 번째 컨텍스트는 참조가 임시로 바인딩되는 경우입니다. 되는 임시 기준이다 결합 또는 그 이 기준의 수명 동안 지속 기준은 바인딩되는 하위 객체의 전체 목적은 임시 제외 :

(일부 예외)