문제

다음을 고려하세요:

int ival = 1.01;
int &rval = 1.01; // error: non-const reference to a const value.
int &rval = ival;

rval = 1.01;

리터럴 값에 대한 &rval의 첫 번째 할당이 예상대로 실패합니다.해당 줄을 주석 처리하면 코드가 컴파일되고 실행됩니다.초기화가 실패한 이유는 이해하지만 rval에 대한 할당이 마지막 줄에서 작동하는 이유는 무엇인지 혼란스럽습니다.리터럴 값에 대한 참조를 할당하는 것이 허용되지 않는다고 생각했습니다.

편집하다: 빠른 답변에 감사드립니다.부끄러움을 감추기 위해 이 글을 삭제하고 싶은 마음이 들지만, 다른 분들이 손가락질하고 웃을 수 있도록 여기에 남겨두겠습니다.

내 자신을 변호하기 위해 나는 책(C++ Primer)의 연습 문제를 해결하고 있으며 이 문제는 참조에 관한 것입니다. 초기화.그래도 애초에 참조의 요점을 너무 완전히 간과한 것은 꽤 당혹스럽습니다.:)

도움이 되었습니까?

해결책

ival 문자 그대로의 값이 아닙니다. 1.01 리터럴 값입니다.다음으로 복사되었습니다. ival 이는 변수이며, 가장 확실히 다른 변수에 참조를 할당할 수 있습니다.

다른 팁

참조가 초기화된 후에는 초기화된 대상에 대한 별칭이 됩니다.참조가 초기화되면 참조가 참조하는 내용을 변경할 수 없습니다.그러나 참조가 참조하는 '사물'을 변경할 수 있습니다(참조가 참조가 아닌 경우). const).

마지막 줄은 실제로 변수를 설정하는 것입니다. ival 1.01로 (다시).

여기에 당신이 놀랄만한 것이 있습니다. ~할 수 있다 그래도 하세요:

const int& x = 42;        // No error!

C++에서는 초기화를 허용합니다. const 리터럴 값(또는 다른 rvalue)으로 참조합니다.실제로 일어나는 일은 컴파일러가 RHS를 복사하여 임시를 생성하고 해당 임시를 참조하기 위해 참조를 초기화한다는 것입니다.컴파일러는 범위가 종료될 때까지(즉, 언제든지 x 이 경우에는 범위를 벗어납니다.)

클래스의 멤버 변수를 초기화할 때는 작동하지 않습니다.

까다롭죠?:)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top