2010-12-28 8 views
11

생성자가 개체에 대한 상수 참조를 가져 와서 로컬로 저장하는 클래스를 작성해야합니다.C++ : 비 임시 const 참조

필자가 예상 할 수있는 가장 일반적인 실수를 방지하기 위해 임시가 아닌 참조 (예 : lvalues ​​참조) 만 허용하고 싶습니다.

비 임시에만 지속적인 참조를하는 함수를 작성하려면 어떻게해야합니까?


범위를 벗어나 이동 때문에 내 수준의 동작을 중단 할 수도 아닌 일시적인 물론

하지만 임시 참조를 허용하지 않음으로 내가 가장 실수를 방지 할 수 있다고 생각합니다. 당신이 참조를 저장하고 생성자가 완료된 후 사용할 필요가하려는 경우

+0

왜 이런 실수를하지 않을 것이라고 생각하십니까? –

+0

음, 참조를 전달해야하는 객체는 인스턴스화 된 후에 사용할 필요가 없습니다 (예 : 객체를 인스턴스화하고 전달하므로 코드 스타일로 인해 스택에서 인스턴스화하지 않습니다). 다른 클래스의 생성자가 _permanent_ 값을 필요로한다는 사실을 잊어 버리면 나를 기억할 임시 거부 (예 : 컴파일 된 시간 오류)가 발생합니다. – peoro

답변

18

, 그것은 포인터를 취할 아마 생성자를위한 최선의 방법 :

struct C { 
    C(const X* p) : p_(p) { } 

    const X* p_; 
}; 

이 방법, 그것은 꽤 많이 보장 있어요 임시 포인터를 가지고 있지 않습니다 (X이 무언가를 정말로하지 않으면, &을 유니폼으로 오버로드하여 this을 반환합니다).

생성자가 포인터를 사용하는 경우 생성자에게 전달하는 X 개체의 수명에주의해야하는 클래스 사용자에게도 명확합니다.

+4

깨끗하고 스마트 한 솔루션! –

+1

그래, 동의하고 깨끗하고 똑똑한 솔루션! 나는 또한'p'가 null이 아니라고 주장 할 것이고 그것을 참조로 저장할 것입니다. – peoro

+0

동의 함, OP는 포인터가 더 낫다는 것을 알아야합니다! 절대적으로 필요가있을 때만 참조를 사용하십시오 (예 : 복사 생성자). – Yttrill

관련 문제