2012-05-04 1 views
0

다음과 같은 코드의 조각을 고려boost :: optional <>은 지역 변수를 어떻게 처리합니까?

struct B { 
    int c; 
    B() { 
     c = 20; 
    } 
}; 
struct A { 
    boost::optional<B> m_b; 
    void f() { 
     B b; 
     this->m_b = b; 
    } 
}; 

int main(void) { 
    A a; 
    a.f(); 
    cout << a.m_b->c << endl; 
} 

분명히, a.m_b은 여전히 ​​유효 m_b에 지역 변수 b를 할당 한 후, 존재한다.

이 종류의 객체는 객체를 지정하는 것이 단지 객체를 가리키는 주소를 지정하는 것이므로 boost::optional<>에 객체를 할당한다고 생각하기 때문에 혼란 스럽습니다. 내 예제에서는 그 객체가 로컬 변수 인 b이기 때문에, 함수 f()이 완료되면 그 주소는 유효하지 않아야합니다.

그럼 a.m_b이 아직 살아 있습니까? 잘못된 주소를 가리켜 야합니다.

답변

2

boost::optionaloperator=B의 복사본 생성자를 호출합니다. 당신이이 점을 삽입하면 struct B 당신은 무슨 일이 일어나고 있는지보고 거기에 중단 점을 설정할 수 있습니다

B(B const& other) 
{ 
} 

부스트 구현의 새로운 배치를 사용, 어쩌면이 당신을 혼란 무엇인가?

+0

아하나. 복사본이 있다는 것을 몰랐습니다. 감사! – CodeNoob

관련 문제