2011-11-02 2 views
0

나는 http://msdn.microsoft.com/en-us/library/szywdw8k%28VS.80%29.aspx을보고 있었고 코드의 일부가 나에게 의미가 없었습니다. LongRef3 상수 선언 할 때다른 유형의 변수에 대한 상수 참조가 허용되는 이유는 무엇입니까?

int iVar; 
const long& LongRef3 = iVar; // OK 

왜 LongRef3 참조 바르 서로 다른 종류 수 있지만?

이에 따르면 Why does the constness of a reference affect whether it can be initialized with a variable of a different type?

. "는 이중 변환되는 임시 INT를 생성하고 변경 가능한 참조, 임시직에 결합 할 수 없기 때문에 반면 const를들 수있다" 그건 나에게 의미가 없다. 어떤 임시 int가 생성되고 있습니까?

왜 이렇게하고 싶습니까? const int보다 &을 선언 할 때 언제 유용할까요?

그리고이 유형을 사용할 수있는 제한이 있습니까?

편집 : 왜이 ​​질문에 투표를 했습니까? 나는 그 질문을 아주 잘 설명했다고 믿는다.

답변

9
int iVar; 
const long& LongRef3 = iVar; 

기준 LongRef3iVar는 참조하지 않지만 형 long 임시 값 iVar 값으로부터 초기화. 코드는 다음과 다소 유사합니다

int iVar; 
const long __injected_iVar__ = iVar; 
const long& LongRef3 = __injected_iVar__; 

당신은 시도하고 당신이 &iVar&LongRef3을 할 때 발생하는 볼 수 있었다.

왜 이렇게하고 싶습니까? const int보다 &을 선언 할 때 언제 유용할까요?

이와 같은 간단한 경우, 은 유용하지 않을 수 있습니다. 그러나 함수 인수가 const 참조에 의해 뭔가를 취하면 호환성있는 형식과 리터럴을 그러한 인수로 사용할 수 있습니다.

그리고이 유형을 사용할 수있는 제한이 있습니까?

호환 가능한 유형에만 해당. 사용자 정의 구조체와 클래스에도 변환이 제공되는 한 적용됩니다.

0

이것은 임시 참조를 임시 참조에 바인드하고 임시 수명을 연장하는 프로세스에서 일반 참조를 허용하는 일반적인 C++ 기능의 한 측면입니다. 보라 :

다른 곳에서 언급 한 바와 같이
Foo bar(); 

void f() 
{ 
    bar(); // temporary dies at the semicolon 

    const Foo & x = bar(); // temporary has its lifetime extended... 

    // ... 

} // ... and dies only here, at the end of x's lifetime 

는, 원래의 코드는 다음 const를 참조에 바인딩 된 일시적으로long를 만듭니다.

복사 또는 이동을 원하지 않거나 RVO에 의존하지 않으려면 임시 수명을 연장하는 것이 바람직 할 수 있습니다. 언어의 가장 유용한 기능 중 하나는 아닐지 모르지만 그 기능이 있습니다.

0

"왜 const int &"이 아니겠습니까?

int foo(); // Not provided by you. 
void bar(const long&); // Not provided by you either. 

bar(foo()); // Works because the temporary long is bound. 
:

당신은 선택의 여지가 있습니다

관련 문제