본문 바로가기
공부

C++ Lvalue & Rvalue

by MY블로그 2022. 11. 29.

기본적으로 Lvalue & Rvalue 에 대하여 말하고자 한다면

 

Left value = 왼쪽값 / Right value = 오른쪽값

 

으로 이해할수있다. 이는 대입 연산자 ( = ) 을 기준으로 방향에따라 왼쪽값 그리고 오른쪽값 으로 이해할 수 있다.

하지만 C++의 관점에서는 전혀 다른 해석을 해야 할 필요가 있기때문에 이에 대한 조사를 진행한다.

참조 : https://effort4137.tistory.com/entry/Lvalue-Rvalue

 


●C++ 에서의 Lvalue Rvalue 의 구분

C++ 에서 모든 표현식은 Lvalue 또는 Rvalue 이다.

Lvalue = 단일 표현식 이후에도 없어지지 않고 지속되는 객체.(즉, 이름을 가지는 객체/const 타입을 포함한 모든 변수)

Rvlaue = 표현식이 종료된 이후에는 더이상 존재하지않는 임시값.(즉, 상수 또는 임시객체)

 

아래의 코드 예제를 통하여 이해해 보도록 한다.

●코드 예제1

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int x = 3;
    const int y = x;
    int z = x + y;
    int* p = &x;

    cout << string("one");

    ++x;
    x++;
}

 

Rvalue 는 굵은 밑줄로 표시되어있다.x, y, z, p 등의 이름을 가지는 변수는 모두 Lvalue 이지만,상수값 3, 임시객체 string("one") 은 표현식이 종료되면 더이상 참조할 수 없는 값이기 떄문에  Rvalue이다.x+y, &x 와 같은 표현식도 마찬가지이다.여기서 ++x 는 Lvalue 이지만, x++ 는 증가된 복사본을 리턴하기 때문에 Rvalue 로 볼 수 있다.

 

●코드 예제2

조금더 확실하게 구분하는 방법으로는표현식에 주소 연산자인 ( & ) 를 붙여보는 방법이 있다. ( & ) 연산자는 Lvalue 를 요구하기 떄문에 표현식이Rvalue 라면 컴파일 오류가 나게 된다.(아래 스크린샷 참조)

&(x++); => C2102 에러! '&' 에 Lvalue 를 요구하는 모습을 볼수있다!


●Rvalue 참조자 &&

지금까지 C++ 에서 int& a = b; 의 형태로 사용하였던 참조자(Reference)는 Lvalue 의 참조자이다.

C++11 표준에서는 Lvalue 참조자 이외에도 Rvalue를 참조할 수 있는 Rvalue 참조자가 추가되었다.

이는 이름처럼 Lvalue 참조자는 같은 Lvalue 만 참조할 수 있고 Rvalue 참조자는 같은 Rvalue 만 참조할 수 있다.

Rvalue 참조자는 Visual Studio 2010 이상 버전의 컴파일러에서 사용 가능하다.

●코드 예제3
int rvalue()
{
    return 10;
}

int main()
{
    int lvalue = 10;

    int& a = lvalue;
    int& b = rvalue();      // error C2440: 'initializing' : cannot convert from 'int' to 'int &'

    int&& c = lvalue;       // error C2440: 'initializing' : cannot convert from 'int' to 'int &&'
    int&& d = rvalue();
}

코드예제 3. 에서도 Lvalue 참조 타입에 Rvalue 를 대입하려하거나

Rvalue 참조 타입에 Lvalue 를 대입하려고 하면 컴파일 오류가 나는 것을 확인할 수 있다.

 

 

댓글