Lvalue 및 Rvalue (C++)
모든 C++ 식에는 형식이 있으며 값 범주에 속합니다. 값 범주는 식 평가 중에 임시 개체를 만들고 복사하고 이동할 때 컴파일러가 따라야 하는 규칙의 기초입니다.
C++17 표준은 다음과 같이 식 값 범주를 정의합니다.
- glvalue는 평가에서 개체, 비트 필드 또는 함수의 ID를 결정하는 식입니다.
- prvalue는 계산에서 개체 또는 비트 필드를 초기화하거나 표시되는 컨텍스트에 지정된 대로 연산자의 피연산자 값을 계산하는 식입니다.
- xvalue는 리소스를 재사용할 수 있는 개체 또는 비트 필드를 나타내는 glvalue입니다(일반적으로 수명이 거의 다 되었으므로). 예: rvalue 참조(8.3.2)와 관련된 특정 종류의 식은 반환 형식이 rvalue 참조이거나 rvalue 참조 형식에 대한 캐스트인 함수에 대한 호출과 같이 xvalue를 생성합니다.
- lvalue는 xvalue가 아닌 glvalue입니다.
- rvalue는 prvalue 또는 xvalue입니다.
다음 다이어그램은 범주 간의 관계를 보여 줍니다.
다이어그램은 glvalue와 rvalue라는 두 개의 자식이 있는 상자 레이블 식으로 시작합니다. glvalue에는 lvalue와 xvalue라는 두 개의 자식이 있습니다. rvalue에는 prvalue와 xvalue라는 두 개의 자식이 있습니다. xvalue는 glvalue의 자식이기도합니다.
lvalue에는 프로그램에서 액세스할 수 있는 주소가 있습니다. lvalue 식의 예로는 변수, 배열 요소, lvalue 참조, 비트 필드, 공용 구조체 및 클래스 멤버를 반환하는 함수 호출을 비롯한 const
변수 이름이 있습니다.
prvalue 식에는 프로그램에서 액세스할 수 있는 주소가 없습니다. prvalue 식의 예로는 리터럴, 비참조 형식을 반환하는 함수 호출 및 식 평가 중에 생성되지만 컴파일러에서만 액세스할 수 있는 임시 개체가 있습니다.
xvalue 식에는 프로그램에서 더 이상 액세스할 수 없지만 식에 대한 액세스를 제공하는 rvalue 참조를 초기화하는 데 사용할 수 있는 주소가 있습니다. 예를 들어 rvalue 참조를 반환하는 함수 호출과 배열 또는 개체가 rvalue 참조인 멤버 식에 대한 배열 아래 첨자, 멤버 및 포인터가 있습니다.
예시
다음 예제에서는 lvalue 및 rvalue에 대한 여러 가지 올바른 사용과 올바르지 않은 사용의 예를 보여 줍니다.
// lvalues_and_rvalues2.cpp
int main()
{
int i, j, *p;
// Correct usage: the variable i is an lvalue and the literal 7 is a prvalue.
i = 7;
// Incorrect usage: The left operand must be an lvalue (C2106).`j * 4` is a prvalue.
7 = i; // C2106
j * 4 = 7; // C2106
// Correct usage: the dereferenced pointer is an lvalue.
*p = i;
// Correct usage: the conditional operator returns an lvalue.
((i < 3) ? i : j) = 7;
// Incorrect usage: the constant ci is a non-modifiable lvalue (C3892).
const int ci = 7;
ci = 9; // C3892
}
참고 항목
이 항목의 예제는 연산자가 오버로드되지 않을 때 올바른 사용과 올바르지 않은 사용의 예를 보여 줍니다. 연산자를 오버로드하여 j * 4
와 같은 식을 lvalue로 만들 수 있습니다.
lvalue 및 rvalue라는 용어는 개체 참조를 참조할 때 자주 사용됩니다. 참조 에 대한 자세한 내용은 Lvalue 참조 선언자: 및Rvalue 참조 선언자: &&>를 참조하세요.
참고 항목
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기