0

const 참조와 관련하여 몇 가지 설명이 필요합니다. this link에서 :
const 참조를 사용하여 임시 객체의 수명 연장

const Foo &myFoo = FuncBar(); 

const를 참조 로컬 개체의 수명을 연장. 그들이 const를 참조

Sandbox(const string& n) : member(n) {} 

문자열의 수명을 사용하지만, 그러나 나는 "네"증가하지 않았다 this link을 선택한 경우.

Sandbox sandbox(string("four")); 


그들은

만 지역 CONST 참조가 수명을 연장 문장을 사용했다.

이어서 제 2 링크에 문자열 "네"기본 함수에 로컬 아니며 CONST 참조 n 수명을 연장하지 않겠습니까?
그렇다면 두 번째 링크에서 수명이 연장되지 않는 이유는 무엇입니까?

+4

"로컬"에서와 같이 "* 지역 변수 *". –

+3

"네"등의 정의가 링크 뒤에 숨겨져 있기 때문에 귀하의 질문은 현재 자체적으로 포함되어 있지 않습니다. 관련 부분을 편집 할 수 있습니까? – Angew

+0

나는 첫 번째 링크에서 main 함수에 로컬 인 "four"문자열이 아니므로 변수 n이 "4"에 대한 로컬 const 참조라는 것을 의미합니까? – user3762146

답변

2

당신이 참조한 두 개의 링크는 로컬 const 참조의 사용법을 보여주고 다른 하나는 클래스 구성원 const 참조의 사용법을 보여주는 의미에서 다릅니다.

로컬 const 참조를 만들고 임시 객체를 참조하면이 컴파일러에서 임시 constr 참조의 범위까지 임시 수명을 연장합니다.

임시 멤버의 수명이 클래스 멤버 참조를 초기화하기 위해 호출 된 생성자를 넘어 확장되지 않으므로 임시 멤버를 가리키는 클래스 멤버 const 참조는 예기치 않은 결과를 가져옵니다. 답변 중 하나에서 설명했듯이 임시 인스턴스는 생성자가 완료 될 때까지만 유지됩니다.

로부터 응답을 인용 : Does a const reference prolong the life of a temporary?

수명 확장 함수 인수를 통해는 이행되지 않는다. §12.2/5 [class.temporary] :

두 번째 컨텍스트는 참조가 임시로 바인딩되는 경우입니다. 참조가 바인드 된 임시 객체 또는 임시 객체가 임시 객체가되는 하위 객체에 대한 임시 객체는 아래 명시된 경우를 제외하고 참조 수명 동안 지속됩니다. 생성자의 ctor-initializer (12.6.2 [class.base.init])의 참조 멤버에 대한 임시 바인딩은 생성자가 종료 될 때까지 유지됩니다. 함수 호출 (§5.2.2 [expr.call])의 참조 매개 변수에 대한 임시 바인딩은 호출이 포함 된 전체 표현식이 완료 될 때까지 유지됩니다.

정확하게 분석하면 두 경우 모두 참조가 초기화 된 범위에서 임시 수명이 연장된다는 것을 알 수 있습니다. 참조가 범위를 벗어나는 범위는 일시적으로 유효하지 않게됩니다.

로컬 const 참조의 경우 scope는 temp로 초기화되는 함수 내부에 있습니다. 클래스 멤버 const 참조의 경우 scope는 temp로 초기화되는 생성자입니다.

또한이 GOTW 문서를 읽어야 https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/