2014-11-19 4 views
1

클래스 CBase가 있습니다.임시 오브젝트의 멤버 함수에 대한 좌변 치 참조가 매달려 참조입니까?

class CBase 
{ 
    ... 
    CBase &Create() 
    { 
     return *this; 
    } 
    ... 
} 

내가 좌변 참조 및 포인터를 선언하면,

CBase &kk = CBase().Create(); 
CBase *pp = &(CBase().Create()); 

kk가 매달려 참조이며, pp는 허상 포인터입니까?

나는 kkpp이 매달려 있다고 생각합니다. CBase()을 호출하면 의심의 여지없이 임시 객체가 만들어 지므로 미분은 CBase().Create()이어야합니다. 그러나 Xcode (버전 6.1)에서는 경고 또는 오류 메시지를 표시하지 않습니다.

아무에게도 힌트를 주거나 C++ 11 문서에서 이러한 동작에 대해 설명 할 수 있습니까? 아니면 내가 틀렸어?

+0

물론 컴파일시 경고/오류가 발생하지 않습니다. 'Create()'가 런타임에 호출 될 때'* this'에 대한 참조를 리턴한다는 것을 알지 못합니다. –

답변

3

예, kk은 매달려있는 참조이며 pp은 매달려있는 포인터입니다. CBase()에 의해 생성 된 임시는 나타나는 전체 표현의 기간 동안 만 존재합니다. 포인터 나 참조가이 객체를 참조하도록하는 것은 유효합니다. 수명이 표현식에 바인딩되어있는 한 마찬가지입니다.

전체 표현 후에도 kkpp이 계속 존재하므로이 경우가 아닙니다. kk을 사용하고 역 참조 pp에는 정의되지 않은 동작이 있습니다.

+0

질문 : 만약 우리가'const CBase & kk = CBase() .Create();'를 사용한다면 - 여기서'const'가 무엇이든 변경합니까? 그것은 여전히 ​​매달려있는 참조입니까, 아니면'kk'의 삶이 오래 연장 되었습니까? –

관련 문제