공부중

[C++] Lvalue Rvalue 본문

Programing/C, C++

[C++] Lvalue Rvalue

곤란 2020. 11. 17. 21:46
반응형

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

docs.microsoft.com/ko-kr/cpp/cpp/rvalue-reference-declarator-amp-amp?redirectedfrom=MSDN&view=msvc-160

 

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

 

반응형