Lvalue 및 Rvalue (C++)

모든 C++ 식에는 형식이 있으며 값 범주속합니다. 값 범주는 식 평가 중에 임시 개체를 만들고 복사하고 이동할 때 컴파일러가 따라야 하는 규칙의 기초입니다.

C++17 표준은 다음과 같이 식 값 범주를 정의합니다.

  • glvalue는 평가에서 개체, 비트 필드 또는 함수의 ID를 결정하는 식입니다.
  • prvalue는 계산에서 개체 또는 비트 필드를 초기화하거나 표시되는 컨텍스트에 지정된 대로 연산자의 피연산자 값을 계산하는 식입니다.
  • xvalue는 리소스를 재사용할 수 있는 개체 또는 비트 필드를 나타내는 glvalue입니다(일반적으로 수명이 거의 다 되었으므로). 예: rvalue 참조(8.3.2)와 관련된 특정 종류의 식은 반환 형식이 rvalue 참조이거나 rvalue 참조 형식에 대한 캐스트인 함수에 대한 호출과 같이 xvalue를 생성합니다.
  • lvalue는 xvalue가 아닌 glvalue입니다.
  • rvalue는 prvalue 또는 xvalue입니다.

다음 다이어그램은 범주 간의 관계를 보여 줍니다.

Diagram of C++ expression value categories.

다이어그램은 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로 만들 수 있습니다.

lvaluervalue라는 용어는 개체 참조를 참조할 때 자주 사용됩니다. 참조 에 대한 자세한 내용은 Lvalue 참조 선언자: 및Rvalue 참조 선언자: &&>를 참조하세요.

참고 항목

기본 개념
Lvalue 참조 선언자: &
Rvalue 참조 선언자: &&