2012-09-14 2 views
0

오류!int에서 double로 변환하는 이유는 무엇입니까?

$ cat double.cc 
#include<iostream> 

int main() { 
    int i = 42; 
    double &r = i; 
} 
$ g++ double.cc 
double.cc: In function ‘int main()’: 
double.cc:5: error: invalid initialization of reference of type ‘double&’ 
from expression of type ‘int’ 
$ 

작동!

$ cat double.cc 
#include<iostream> 

int main() { 
    int i = 42; 
    const double &r = i; 
} 
$ g++ double.cc 
$ 

왜 첫 번째 경우에 오류가 발생합니까? 나는 이것이 here에 대해 논의 된 것을 알고 있지만, 왜 이것이 허용되지 않는지 이해할 수 없다. int에서 const double&까지 허용된다. 여기

+0

왜 코멘트가없는 임의의 드라이브가 downvote입니까? 이것은 좋은 질문입니다. 특히 Moeb이 조사한 이후에 (적어도 Moeb에게는) 만족스럽지 않은 관련 질문을 발견했습니다. –

답변

4

당신이

int i = 42; 
double const &r = i; 

i

이 암시 적으로 임시 값 결과, 또는 를 rvalue하는 이중 변환됩니다 쓸 때. const가 아닌 참조는 rvalue에 바인딩 할 수 없으므로 이 위의 작업을 수행하려면 double const&이어야합니다.

6
int i = 42; 
double &r = i; 

rdouble에 대한 참조이지만, ir 참조 할 수 어떻게 그런 다음 double 아닌가요? 그럴 순 없어. 따라서 i 식에서 double 형식의 임시 개체를 만듭니다. 그러나 다시 rnon-const 참조이며 임시 개체에는 바인딩 할 수 없습니다. 당신이 그것을 const를 참조 할 경우

그러나, 그것은 작동합니다 : const 참조 i에서 생성되는 임시 개체에 바인딩 할 수

double const & r = i; 

하는 것으로.

+0

그렇다면'const double '은'int'를 어떻게 참조 할 수 있습니까? – Moeb

+0

@Moeb : 편집 및 설명. :-) – Nawaz

4

C++에서는 참조가 다른 변수의 별칭이라고 생각할 수 있습니다. 이 형식은 non-cv로 정규화 된 형식으로 일치해야하며,이 경우 형식이 다릅니다.

const double&와 함께 작동하는 이유는 컴파일러가 i의 복사본을 가진 임시 double을 생성하고 해당 임시 참조를 바인딩하기 때문입니다. 일시적인 바인딩을 사용하면 임시의 수명이 참조 수명까지 연장되기 때문에 허용됩니다.

관련 문제