2012-12-11 2 views
1
C에서

++ const를 참조로 임시을 결합 할 수 있습니다 const 참조?임시 참조를 const 참조에 바인딩 할 수 없게하는 방법이 있습니까?</p> <pre><code>struct A {}; int main() { const A& a = A(); } </code></pre> <p>이 클래스의 임시을 결합하는 것은 불가능하다 있도록 일부 특정 클래스 A에 대해이 작업을 비활성화 할 수있는 방법이 있나요 :

+0

curiocity에서 벗어난 이유는 무엇입니까? –

+0

나는 그것을 필요로하지 않는다. 단지 curiocity =를 묻는다.) – vitaut

+0

예제는 어리 석다.하지만 참조가 const 인 경우 라하더라도, 어떤 객체에 직접 참조를 바인딩하고 싶을 수도있다. – curiousguy

답변

7

아니요,이 작업을 수행해야하는 경우 다른 작업을 잘못하고있는 것입니다.

+0

실제로 C++ 03에 따르면이 방법이 있지만 인기있는 컴파일러에서는 작동하지 않습니다. 자세한 내용은 내 대답을 참조하십시오. – vitaut

2

일반적으로 임시 참조를 const 참조에 사용하지 않도록 설정하는 방법이없는 것처럼 보입니다.

그러나, 나는 C++ 2003 표준에 인용하고자하는 입증 된 답을주고 : 이니셜식이 T2로, 클래스 타입를 rvalue이며, 경우

을 "CV1의 T1은"참조입니다 - 호환 가능 "cv2 T2"인 경우, 참조는 다음 중 한 가지 방법으로 바인딩됩니다. 선택은 구현에 따라 정의됩니다.

- 참조는 rvalue (3.10 참조)로 표현 된 객체 또는 그 하위 개체는 입니다.

- 임시 유형 "cv1 T2"[sic]가 생성되고 생성자가 호출되어 rvalue 개체 전체를 임시로 복사합니다. 참조는 임시 또는 하위 오브젝트 에 바인드됩니다. 93)

복사본을 만드는 데 사용되는 생성자는 복사본이 실제로 완료되었는지 여부에 관계없이 호출 가능해야합니다.

그래서 복사 생성자는 개인함으로써이 C++ 03에서 달성 될 수 있음을 보일 수 있습니다 :

struct A { 
    A() {} 
private: 
    A(const A&); 
}; 

int main() { 
    const A& a = A(); 
} 

그러나,이 인기 컴파일러 작동하지 않습니다. 예를 들어 GCC는 위의 코드를 -std=c++03 플래그로 받아들입니다. 연타도이 코드를 허용하지만 경고 :

test.cc:8:12 : 경고 : C++ 98이 클래스에 대한 접근 복사 생성자가 필요합니다 'A' 임시에 대한 참조를 바인딩; 비공개였습니다

이렇게 표준을 따르지 않아도됩니다.

이 경우 액세스 가능 복사 생성자가 더 이상 필요하지 않습니다.