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를 참조 두 번째 질문의 범위를
를 벗어날 때까지
두 개의 개별 질문이있는 경우 두 개의 별도 게시물을 만드십시오. –
임시 직원에 대한 const 참조 수명과 관련한 Herb Sutter : http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-most-important-const/ –
@BenjaminLindley : 그렇습니다. 그러나 그 상황을 2 번 설명하기는 어려울 것입니다. 따라서 질문 1에 답변하는 사람도 질문 2에 답변 할 수 있습니다. – Frunsi