Updated:

1 minute read

개요

  • l-value
    • locator 혹은 left의 약자로 메모리 위치를 참조할 수 있는 값을 의미
    • 주로 등호(=) 왼쪽에 위치할 뿐 오른쪽에 위치 가능
  • r-value
    • right의 약자로 식의 값을 의미
    • 모든 l-value는 r-value이지만 모든 r-value가 l-value는 아님
      • 즉 l-value가 아닌 r-value는 등호 왼쪽에 위치 불가
  • l-value reference
    • &로 정의된 레퍼런스
    • r-value를 받을 수 없음
  • const reference
    • l-value, r-value 모두 받을 수 있음
  • r-value reference
    • &&로 정의된 레퍼런스
    • 복사가 아닌 이동
    • const reference로 r-value를 받을 경우 수정이 불가능한 문제를 해결
    • int &&i = 3;
      • i는 타입이 r-value reference인 l-value
      • i를 함수 인자로 전달하면 l-value 인자 함수 호출


코드

#include <iostream>

using namespace std;

void func(int &i) { cout << "func(int &i)" << endl; }
void func(const int &i) { cout << "func(const int &i)" << endl; }
void func(int &&i) {
    i = 5;
    cout << "func(int &&i) - " << i << endl;
}

int main() {
    int i = 1;
    // int &i1 = 1;
    const int &i2 = 2;
    int &&i3 = 3;
    // int &&i4 = i;

    func(i);
    func(i2);
    func(i3);
    func(3);

    cout << i << ", " << i2 << ", " << i3 << endl;

    return 0;
}


실행 결과

func(int &i)
func(const int &i)
func(int &i)
func(int &&i) - 5
1, 2, 3