2008-11-02 5 views

답변

20

참조를 통해 범위를 확장하는 것은 안전하지 않습니다. C++의 객체는 obj1이 범위를 벗어날 때 레퍼런스 카운트되지 않습니다. badIdea()의 결과를 참조하면 문제가 발생합니다.

+0

질문은 C++ 및 참조 바인딩에 관한 것입니다. 참조 횟수가 입력되지 않습니다. 나는 내 자신의 대답을 추가했지만 간단히 참조 바인딩을 통해 객체의 범위를 확장 할 수 있지만 디자인에는주의를 기울여야합니다. 당신이 그것을 이해하지 못하면 그것을하지 마십시오. –

+0

는 나는 당신이 * * 로컬 객체 참조 카운트를 (C++ 물론 그들 중 하나를,없는)를 지원하는 언어로 범위를 벗어난하지 않고 참조를 반환 할 수있는 방법이기 때문에 그가 계산을 참조 언급 생각합니다. –

+0

난 내가 다른 언어가이 만에 "범위 확장"입니다, 아마 좋은 생각 –

0

가 무슨 뜻 이죠 명확히하십시오. 당신을 가정

이 작업을 수행하려는 :

int * p = NULL; 
{ 
    int y = 22; 
    p = &y; 
} 
*p = 77; // BOOM! 

은 그런 아니, 절대로하지, 범위에 대한 참조를함으로써 확장되지 않습니다.

스마트 포인터를보고 싶을 수도 있습니다. 부스트 라이브러리에서 : clickety

+0

나는 포인터가 아니라 참조를 의미했습니다. –

+1

참조는 포인터와 동일하게 동작합니다. 다시 바인딩 할 수 없습니다. – peterchen

14

참조가있는 범위를 확장해도 괜찮은 위치는 다음과 같습니다. constnamespace 참조 또는 기능 범위 (클래스 멤버가 아님)

const int & cir = 1+1; // OK to use cir = 2 after this line 

이 트릭은 구체적인 범위 가드의 기본 클래스에 const 참조를 캡처하기 위해 Andrei Alexandrescu's 아주 멋진 scope guard에 사용됩니다.

+0

참고 살아 할당 된 개체를 계속 할 수있는 메커니즘을 암시하려고했다, 용어 "레퍼런스 카운팅은"문제를 muddies 방법을 볼 수 있습니다 임시의 대개 매우 좁은 "범위"가 부모 범위로 확장되어 OP가 묻는 것과 상당히 다른 것을 느낄 수 있습니다. C + +의 조금 알려진면을 언급하면서 많은 사람들이 처음에는 혼란스러워한다는 명성을 얻었습니다. – philsquared