2012-07-07 2 views
5

더 예시하여 설명 세그멘테이션 오류 원인 프로그램이 0을 인쇄합니다. 실제 코드는 seg fault를 얻는다.

const 참조에 할당 된 임시 직원의 수명을 연장하는 규칙이 여기에 적용되지만 예상대로 적용되지 않을 것으로 예상됩니다. 그 이유를 아십니까? '

답변

4

이 규칙은 클래스 멤버에게는 적용되지 않습니다. 임시의 수명이 될 수 있도록 클래스의 일부로 유지해야한다는 것을 의미하는 것이다 임시 더 오래보다 만들기

A temporary bound to a reference member in a constructor's ctor-initializer 
persists until the constructor exits. 

:이 C++ 03 표준의 12.2.5에 명시되어 유지. 클래스가 정의 될 때 클래스의 크기를 알아야하기 때문에 생성자가 별도의 컴파일 단위에 있으면이 작업은 불가능합니다.

// header file 
struct A { 
    A(); 
    B &b; 
}; 


// file1.cpp 
void f() 
{ 
    A a; // Reserve the size of a single reference on the stack. 
} 


// file2.cpp 
A::A() 
: b(B()) // b is referencing a temporary, but where do we keep it? 
     // can't keep the temporary on the stack because the 
     // constructor will return and pop everything off the stack. 
     // Can't keep it in the class because we've already said the 
     // class just contains a single reference. 
{ 
} 
+0

스폿이 켜져있는 이유는 무엇입니까? 오늘은 천천히. : ( –

+0

간결하고 포괄적입니다. – davka