6

표준의 12.2.5 절은 말합니다 : 전체 식의 완료가 전화를 포함 할 때까지임시 수명 연장

함수 호출에서 기준 매개 변수에 임시 바운드 (5.2.2) 가 지속 . 함수에서 반환 된 값에 대한 임시 바인딩은 함수가 종료 될 때까지 문 (6.6.3)을 유지합니다. 이러한 모든 경우에 참조가 바인드 된 임시를 제외하고 참조를 초기화하는 표현 의 평가 중에 작성된 임시 키는 생성 된 의 전체 표현식의 끝에서 삭제되고 그들의 건설의 역순으로 진행. 건설.

내가 이해하려고 노력하는 코드는 다음과 같습니다 라인 #1

#include <iostream> 

const int& foo(const int& fooRef) 
{ 
    return fooRef; 
}          // #0 

int main (void) 
{ 
    const int& numberRef = foo(5);  // #1 
    std::cout << numberRef;   // #2 
    return 0; 
} 

은 임시 객체가 생성되어 foofooRef 매개 변수에 바인딩됩니다. fooRef은 라인 #0에서 파괴되었습니다. 그래서 평생 연장은 전이 적이 아니기 때문에 임시가 여기에서 파괴되어야한다고 생각했습니다.

질문 :

  1. until the function exits은 무엇을 의미합니까? untill it finished executing을 의미합니까?

  2. 출력이 5 인 이유는 무엇입니까? 임시 객체가 여전히 라인 #2에 있습니까?

  3. 이 견본의 작동 방식을 파악하기 위해 표준 견적을 어떻게 해석 할 수 있습니까?

표준에 대한 단계별 단계별 워크 스루가 크게 환영 할 것입니다. 고맙습니다!

P. S. 대답 대답 here도 코드가 broken이고 내가 왜 그런 결과를 얻지 못했습니까?

답변

3

함수가 종료 될 때까지는 무엇이 수행됩니까? 실행이 끝날 때까지 의미합니까?

예.

출력이 5 개인 이유는 무엇입니까? 임시 객체가 여전히 2 번 줄에 있습니까? 당신은뿐만 아니라 (충돌 포함) 다른 것 같은 5뿐만 아니라 42를 얻을 수 있도록 살아있는 개체에 바인딩되지 않은 참조를 역 참조

, 정의되지 않은 동작입니다. 정의되지 않은 동작이있는 프로그램에 대해서는 기대할 수 없습니다.

이 견본의 작동 방식을 파악하기 위해 표준 견적을 어떻게 해석 할 수 있습니까?

예전과 매우 흡사합니다. 임시 매개 변수는 함수 매개 변수 fooRef에 바인딩됩니다.이 매개 변수는 함수에서 반환 될 때 파손됩니다. 임시는 반환 값에 바인딩되기 때문에 함수가 반환 될 때 해당 객체는 존재하지 않게됩니다. 나중에 UB를 제공하는 매달린 참조를 역 참조합니다.

1
  1. 이것은 닫는 중괄호 (예 : })까지를 의미합니다.

  2. 당신은 UB를 호출 했으므로 매달린 참조가 있습니다.

다음 코드 수정을 시도하여 인쇄 내용을 확인하십시오. 그것은 아마도 6을 출력 할 것이고 이것은 마지막으로 스택에 있었기 때문입니다. 또는 std::string을 대신 전달하면 충돌이 발생할 수 있습니다.

int main (void) 
{ 
    const int& numberRef = foo(5); 
    foo(6); 
    std::cout << numberRef; 
    return 0; 
}