IT TIP

오류 : 'int'유형의 rvalue에서 'int &'유형의 상수가 아닌 참조를 잘못 초기화했습니다.

itqueen 2020. 10. 13. 20:00
반응형

오류 : 'int'유형의 rvalue에서 'int &'유형의 상수가 아닌 참조를 잘못 초기화했습니다.


잘못된 형식 :

int &z = 12;

올바른 형식 :

int y;
int &r = y;

질문 :
첫 번째 코드가 잘못된 이유는 무엇입니까? 제목에있는 오류의 " 의미 "는 무엇입니까?


C ++ 03 3.10 / 1은 "모든 표현식은 lvalue 또는 rvalue입니다."라고 말합니다. lvalueness 대 rvalueness는 객체가 아니라 표현식의 속성이라는 것을 기억하는 것이 중요합니다.

Lvalues는 단일 식 이상으로 지속되는 개체의 이름을 지정합니다. 예를 들어, obj, *ptr, ptr[index], 및 ++x모든 lvalues입니다.

Rvalue는 자신이 살고있는 전체 표현의 끝 ( "세미콜론")에서 증발하는 임시 값입니다. 예를 들어, 1729, x + y, std::string("meow"), 및 x++모든 우변입니다.

연산자의 주소는 "피연산자가 lvalue이어야 함"을 요구합니다. 한 표현식의 주소를 취할 수 있다면 표현식은 lvalue이고 그렇지 않으면 rvalue입니다.

 &obj; //  valid
 &12;  //invalid

int &z = 12;

오른쪽 int에는 정수 리터럴에서 임시 개체 유형 이 생성 12되지만 임시 개체는 상수 가 아닌 참조에 바인딩 될 수 없습니다. 따라서 오류입니다. 다음과 같습니다.

int &z = int(12); //still same error

임시가 생성되는 이유는 무엇입니까? 참조는 메모리에있는 객체를 참조해야하고 객체가 존재하려면 먼저 생성되어야합니다. 개체의 이름이 지정되지 않았으므로 임시 개체입니다. 이름이 없습니다. 이 설명에서 두 번째 경우가 좋은 이유가 꽤 분명해졌습니다.

임시 객체는 const 참조에 바인딩 될 수 있습니다. 즉, 다음과 같이 할 수 있습니다.

const int &z = 12; //ok

C ++ 11 및 Rvalue 참조 :

완전성을 위해 C ++ 11에 임시 개체에 바인딩 할 수있는 rvalue-reference가 도입되었음을 추가하고 싶습니다. 따라서 C ++ 11에서는 다음과 같이 작성할 수 있습니다.

int && z = 12; //C+11 only 

&&intead가 &있습니다. 또한 바인딩 const되는 객체가 zinteger -literal로 만들어진 임시 객체 임에도 불구하고 더 이상 필요하지 않습니다 12.

C ++ 11 도입 이후 r- 수치 참조 , int&지금부터는라고 좌변 참조 .


12에서 참조하는 데이터와 달리 변경할 수없는 컴파일 타임 상수입니다 int&. 당신이 할 있는 것은

const int& z = 12;

non-const 및 const 참조 바인딩은 다른 규칙을 따릅니다.

다음은 C ++ 언어의 규칙입니다.

  • 리터럴 숫자 ( 12) 로 구성된 표현식 은 "rvalue"입니다.
  • rvalue로 상수가 아닌 참조를 만드는 것은 허용되지 않습니다. 형식 int &ri = 12;이 잘못되었습니다.
  • rvalue를 사용하여 const 참조를 만들 수 있습니다.이 경우 명명되지 않은 개체가 컴파일러에 의해 생성됩니다. 이 객체는 참조 자체가 존재하는 한 지속됩니다.

이것이 C ++ 규칙이라는 것을 이해해야합니다. 그들은 단지 그렇습니다.

약간 다른 규칙을 사용하여 다른 언어, 예를 들어 C ++ '를 만드는 것은 쉽습니다. C ++ '에서는 rvalue를 사용하여 상수가 아닌 참조를 만들 수 있습니다. 여기에는 일관성이 없거나 불가능한 것이 없습니다.

그러나 그것은 프로그래머가 의도 한 것을 얻지 못할 수도있는 위험한 코드를 허용 할 것이고, C ++ 디자이너는 그 위험을 피하기로 올바르게 결정했습니다.


참조는 변경할 수있는 항목 (lvalues)에 대한 "숨겨진 포인터"(null이 아님)입니다. 상수로 정의 할 수 없습니다. "변수"여야합니다.

편집하다::

나는 생각하고있다

int &x = y;

거의 동등한

int* __px = &y;
#define x (*__px)

여기서 __px새로운 이름이고, 상기는 #define x단지 선언 함유 블록 내부 작동 x참조.

참고 URL : https://stackoverflow.com/questions/8293426/error-invalid-initialization-of-non-const-reference-of-type-int-from-an-rval

반응형