오류 : '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
되는 객체가 z
integer -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
참조.
'IT TIP' 카테고리의 다른 글
날짜 생성자는 IE에서 NaN을 반환하지만 Firefox 및 Chrome에서 작동합니다. (0) | 2020.10.13 |
---|---|
Android Eclipse DDMS-파일을 가져 오기 위해 휴대 전화에서 데이터 / 데이터에 액세스 할 수 없습니다. (0) | 2020.10.13 |
문자열의 특수 문자를 _ (밑줄)로 바꿉니다. (0) | 2020.10.13 |
GZIPInputStream 한 줄씩 읽기 (0) | 2020.10.13 |
GAC에서 .NET DLL 파일을 어떻게 등록합니까? (0) | 2020.10.13 |