본문 바로가기
💻 programming/c++

[c++] lvalue reference and rvalue reference

by 연구원-A 2021. 8. 4.
반응형

lvalues references and rvalues references in C++ with Examples - GeeksforGeeks

l-value and r-value

l=value는 객체를 가리키는 메모리 위치를 나타내고, r-value는 메모리 위치에 할당된 값을 나타냅니다. 여기서 참조 (reference)는 이미 존재하는 변수에 다른 이름을 할당하는 것외에 다른 기능은 없습니다.

int a  = 10;

int& lref = a; // 좌측 값 참조
int&& rref = 10; // 우측 값 참조

아래 코드는 좌측 값 참조와 참조된 변수의 주소를 비교하는 코드입니다. 마치 포인터처럼 같은 메모리 주소를 갖는 것을 알 수 있습니다.

#include <iostream> 
using namespace std; 

// Driver Code 
int main() 
{ 
    // Declaring the variable 
    int a{ 10 }; 

    // Declaring reference to 
    // already created variable 
    int& b = a; 

    // Provision made to display 
    // the boolean ouptut in the 
    // form of True and False 
    // instead of 1 and 
    cout << boolalpha; 

    // Comparing the address of both the 
    // varible and its reference and it 
    // will turn out to be same 
    cout << (&a == &b) << endl; 
    return 0; 
}

r-value reference

  • 임시 객체 (r-value)를 참조로 받으면 임시 객체의 수명을 늘릴 수 있습니다
    : 이 특징을 이용해 이동 생성자를 정의할 때 r-value reference가 사용됩니다.
  • r-value reference는 l-value이므로 const가 아니라면 l-value를 대입 연산 (=)할 수 있다.
#include <iostream>
using namespace std;

int main() {
    int a = 10;

    int& lref = a; // l-value reference
    int&& rref = 20; // r-value reference

    lref = 30; // l-value reference 값을 변경할 수 있음
    rref = 40; // r-value reference 값을 변셩할 수 있음

    int &&ref = a; // error; 
}
#include <iostream>

using namespace std;

void foo(int& a) {
    cout << "lvalue reference" << endl;
}

void foo(int&& a) {
    cout << "rvalue reference" << endl;
}

int main() {
    int a = 10;
    int& lref = a;
    int&& rref = 10;

    cout << lref << endl;
    cout << rref << endl;

    foo(a);// lvalue reference
    foo(10); // rvalue reference
    foo(lref); // lvalue reference
    foo(rref); // lvalue reference
}
반응형

'💻 programming > c++' 카테고리의 다른 글

[c++] thread vs task (thread 와 async)  (0) 2021.08.04
[c++] thread  (0) 2021.08.04
[c++] condition variable (조건 변수)  (0) 2020.12.17
[c++] std::shared_mutex  (0) 2020.12.16
[c++] std::timed_mutex  (0) 2020.12.16

댓글