Patrick's Devlog

[Modern C++] Lvalue 및 Rvalue 본문

Study/C++

[Modern C++] Lvalue 및 Rvalue

Patrick_ 2022. 5. 20. 14:44

모든 C++ 표현에는 형식이 존재하며 value 범주에 속한다. value 범주는 표현 평가 중 임시 개체를 생성, 복사, 이동할 때 컴파일러가 따라야하는 규칙의 기초이다.

 

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

 1. glvalue는 평가(evaluation)에서 개체, 비트필드 또는 함수의 ID(동일성)를 결정하는 표현

 2. prvalue는 평가에서 객체나 비트 필드를 초기화하거나 표시되는 컨텍스트에 지정된대로 연산자의 피연산자 값을 계산하는 표현식

 3. xvalue는 리소스를 재사용할 수 있는 개체 또는 비트 필드를 나타내는 glvalue

 4. lvalue는 xvalue가 아닌 glvalue

 5. rvalue는 prvalue 또는 xvalue

 

범주 간의 관계

lvalue에는 프로그램에서 액세스할 수 있는 주소가 있다. 예로는 변수, 배열 요소, lvalue 참조, 비트 필드, 공용 구조체 및 클래스 멤버를 반환하는 함수 호출을 비롯한 const 변수 이름이 존재한다.

prvalue 표현에는 프로그램에서 액세스할 수 있는 주소가 없다. 예로는 리터럴, 참조가 아닌 형식을 반환하는 함수 호출, 표현 평가 중에 생성되지만 컴파일러에서만 액세스 가능한 임시 개체가 존재한다. 

xvalue 표현에는 프로그램에서 더이상 액세스할 수 없지만 식에 대한 액세스를 제공하는 rvalue 참조를 초기화하는데 사용할 수 있는 주소가 있다. 예를 들면 rvalue 참조를 반환하는 함수 호출과 배열 또는 개체가 rvalue 참조인 멤버식에 대한 배열 아래 첨자, 멤버 및 포인터가 존재한다. 

 

// lvalue와 rvalue에 대한 예시
int main()
{
    int i, j, *p;

    // 알맞은 사용 : 변수 i 는 lvalue이며 리터럴 7은 prvalue이다. 
    i = 7;

    // 잘못된 사용 : 왼쪽 피연산자는 lvaule여야 한다.(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
}

참고 문헌

https://docs.microsoft.com/ko-kr/cpp/cpp/lvalues-and-rvalues-visual-cpp?view=msvc-170 

 

값 범주: Lvalues 및 Rvalues(C++)

자세한 정보: Lvalues 및 Rvalues(C++)

docs.microsoft.com

 

'Study > C++' 카테고리의 다른 글

[Effective C++] Chapter 2 정리 - 2  (1) 2022.09.02
[Effective C++] Chapter 2 정리 - 1  (0) 2022.05.26
[Modern C++] Smart Pointer  (0) 2022.05.17
[Modern C++] 시작하기  (0) 2022.05.16
[Effective C++] Chapter 1 정리 - 2  (0) 2022.05.11