2012-06-19 4 views
0

std :: string을 래핑하기위한 클래스가 필요하다고 가정하고 다른 모든 세부 사항을 제외하고는 타입 변환을 사용하여 자동으로 std :: string으로 자동 변환합니다 운영자 :타입 연산자에 의해 생성 된 임시에 대한 참조

class MyWrappedString { 
    std::string m_value; 
    /* ... */ 
public: 
    inline operator std::string() const { 
     return m_value; 
    } 
}; 

그래서, 운영자 은, 랩 된 문자열 객체의 복사본를 반환합니다.

그러나 다음 코드는 왜 겉으로보기에는 정확합니까?

MyWrappedString x; 
const std::string& y = x; 
// now, y should be a reference to a temporary, right? 
std::cout << "y is: " << y << std::endl; 

변환 연산자 정도로 const std::string& y = x 그 임시 사본에 대한 참조를 만들 것이다 m_value 임시 사본을 반환한다.

왜이 기능이 작동합니까? 참조 된 객체의 일생 중 일부 확장이 있음을 기억하지만 확실하지 않습니다.

두 번째 질문 : const 참조를 반환하는 타입 캐스트 연산자를 사용할 수 있습니까?

예컨대 :

inline operator const std::string &() const { 
    return m_value; 
} 

그래서, 위의 코드는 임시 사본에 작동하지 않습니다?

추신 :이 질문은 약간 관련이 있습니다 : Lifetime of temporaries,하지만 여전히 다른 문제. 그래, 당신은 const를 참조를 반환 할 수 있습니다 : (정상적으로 범위를 벗어나 밖으로 갈 것입니다 경우에도)에 const를 참조 두 번째 질문의 범위를

를 벗어날 때까지

+0

두 개의 개별 질문이있는 경우 두 개의 별도 게시물을 만드십시오. –

+1

임시 직원에 대한 const 참조 수명과 관련한 Herb Sutter : http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-most-important-const/ –

+0

@BenjaminLindley : 그렇습니다. 그러나 그 상황을 2 번 설명하기는 어려울 것입니다. 따라서 질문 1에 답변하는 사람도 질문 2에 답변 할 수 있습니다. – Frunsi

답변

2

const 참조 살아 참조를 유지하는 함수의 반환 값은 const 참조로 바뀌어야합니다.

+0

괜찮습니다. 'operator const std :: string & (const)'는 작동합니다 (VS2010 및 gcc4에서). 나는 그것을 기대하지 않았지만 그것은 단지 효과가있다. 하지만, 둘 다 가질 수는 없습니다 (참조 유무와 관계 없음). 고마워! – Frunsi

+0

@Frunsi : 나는 암시 적 타입 변환이 없다고 믿습니다. 그러나 만약 당신이 그것들을 제공한다면, 호출자가 원하는지를 결정할 수 있도록'const std :: string &'을 제공하는 것이 더 낫습니다. 문자열 복사 여부. –

+0

@ DavidRodríguez-dribeas : 예, 맞습니다. 암묵적인 형식 변환도 믿지 않습니다. 그러나 여기에 나의 특별한 사용 사례에서, 그것은 매우 편리하다. 그러나 나는 아직도 const reference를 반환하는 타입 캐스트 연산자가 작동한다는 사실에 매우 놀랐다. 물론 컴파일러는 이러한 타입을 지원하는 데 어려움을 겪고 있습니다 (참조는 타입이 아니기 때문에 확장 된 수명과 같은 특별한 의미가 있습니다 ...) – Frunsi