공부중
[C++] Lvalue Rvalue 본문
Lvalue와 Rvalue라는것이 있다. 흔히들 Lvalue와 Rvalue는 Left Value와 Right Value라고 말하며 이것은 =기호를 기준으로 왼쪽과 오른쪽에 있는것을 각각 Lvalue와 Rvalue로 말한다.
하지만 위의 내용은 100% 맞다고 볼수가 없다.
docs.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?redirectedfrom=MSDN&view=msvc-160
위의 MSDN에서 Lvalue와 Rvalue에 정리되어있는데 읽어보고 정리해 보려고 한다.
MSDN의 내용만 보실꺼면 위의 링크로 들어가시기 바랍니다.
모든 C++의 표현식에는 유형이 있고 value 카테고리에 속합니다.
value 카테고리는 표현식 평가중 임시객체를 생성, 복사 및 이동할때 컴파일러가 따라야하는 규칙의 기초이다.
C++17은 다음과 같이 표현식의 value 카테고리를 정의한다.
- glvalue는 객체, 비트필드 또는 함수를 결정하는 표현식이다.
- prvalue는 객체 또는 비트 필드를 초기화 하거나 연산자가 나타나는 컨텐스트에 지정된대로 연산자의 피연산자 값을 계산하는 표현식이다.
- xvalue는 리소스를 재활용 할 수 있는 객체 또는 비트 필드를 나타내는 glvalue이다.
- lvalue는 xvalue가 아닌 glvalue이다.
- rvalue는 prvalue또는 xvalue이다.
lvalue에는 프로그램이 엑세스 할 수 있는 주소가 있다.
lvalue의 표현식으로의 예로는 변수명, const 변수, 배열 요소, lvalue 참조를 반환하는 함수, 비트필트. union 과 class 멤버가 있습니다.
prvalue 표현식에는 프로그램에서 엑세스할 수 있는 주소가 없다.
prvalue의 예로는 리터럴, 비 참조 유형을 반환하는 함수 호출, 식 평가중에 생성되지만 컴파일러에서만 엑세스 할수있는 임시개체가 있다.
xvalue의 표현식에는 더이상 프로그램에서 액세스 할 수 없지만 표현식에 대한 엑세스를 제공하는 rvalue 참조를 초기화하는데 사용할 수 있는 주소가 있다. 예를들어 rvalue 참조를 반환하는 함수 호출과 배열 첨자, 멤버 및 배열 또는 개체가 ravlue 참조인 멤버 식에 대한 포인터가 있다.
int main()
{
int i, j, *p;
// 옳은 사용방법: 변수 i는 lvalue이고 리터럴 7은 prvalue 이다.
i = 7;
// 잘못된 사용방법: 왼쪽 피연산자는 l-value이어야 합니다. (C2106).`j * 4` 는 prvalue이다.
7 = i; // C2106
j * 4 = 7; // C2106
// 옳은 사용방법: 역참조된 포인터는 lvalue이다.
*p = i;
// 옳은 사용방법: 조건 연산자 (?:)는 lvalue를 리턴한다.
((i < 3) ? i : j) = 7;
// 잘못된 사용방법: 상수 ci 수정 불가능한 lvalue이다. (C3892).
const int ci = 7;
ci = 9; // C3892
}
추가 참조 링크
docs.microsoft.com/ko-kr/cpp/cpp/lvalue-reference-declarator-amp?view=msvc-160
en.cppreference.com/w/cpp/language/value_category
'Programing > C, C++' 카테고리의 다른 글
[C/C++] 정수와 실수의 표현방식 (0) | 2021.02.24 |
---|---|
[C++] 전위/후위 증가/감소 연산자 (0) | 2020.11.18 |
[C/C++] Right to Left Rules(오른쪽-왼쪽 규칙) (1) | 2020.11.14 |
[C++] const 위치에 따른 상수화 되는 대상 (0) | 2020.11.09 |
[C/C++] malloc, new (0) | 2019.09.20 |