공부중
[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
값 범주: Lvalues 및 Rvalue (c + +)
Lvalue 및 Rvalue (C++)Lvalues and Rvalues (C++) 이 문서의 내용 --> 모든 c + + 식에는 형식이 있으며 값 범주에 속합니다.Every C++ expression has a type, and belongs to a value category. 값 범주는 식 평가 중에 임시 개체
docs.microsoft.com
위의 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
Lvalue 참조 선언 자:&
Lvalue 참조 선언 자:&Lvalue Reference Declarator: & 이 문서의 내용 --> 개체의 주소를 보유하지만 구문상 개체처럼 동작합니다.Holds the address of an object but behaves syntactically like an object. 구문Syntax type-id & cas
docs.microsoft.com
Rvalue 참조 선언 자: &&
Rvalue 참조 선언 자: &&Rvalue Reference Declarator: && 이 문서의 내용 --> rvalue 식에 대한 참조를 보유합니다.Holds a reference to an rvalue expression. 구문Syntax type-id && cast-expression rvalue 참조를 사용하면 lvalue와 r
docs.microsoft.com
en.cppreference.com/w/cpp/language/value_category
Value categories - cppreference.com
Each C++ expression (an operator with its operands, a literal, a variable name, etc.) is characterized by two independent properties: a type and a value category. Each expression has some non-reference type, and each expression belongs to exactly one of th
en.cppreference.com
'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 |