ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Rvalue reference] Introduction(1)
    개발/C·C++ 2021. 5. 12. 10:29

    >> 번역글입니다

    >> 의역은 있고 오역이 있을 수 있습니다

    >> 출처 thbecker.net/articles/rvalue_references/section_01.html

     

    rvalue reference는 C++11 표준에 추가된 특징입니다. rvalue reference를 파악하기 조금 어렵게 만드는 것은, 처음 봤을 때 목적이 무엇이고 어떤 문제를 해결할 수 있는지 명확하게 알 수 없다는 점입니다. 일단 rvalue reference가 무엇인지 설명하겠습니다. 해결할 수 있는 문제부터 시작해, rvalue reference가 이를 어떻게 해결할 수 있는지 보여드리겠습니다. 이 방법이 rvalue reference의 정의가 타당하고 자연스럽게 보이도록 해줄 겁니다.

     

    rvalue reference는 최소 두 가지의 문제를 해결합니다.

        1. 이동 의미론 실행

        2. 완벽 전달

    이 문제에 익숙하지 않아도 걱정하지 마세요. 아래에서 자세하게 다루겠습니다. 이동 의미론부터 시작합시다. 그 전에 C++에서 lvalue와 rvalue가 무엇인지 먼저 상기해드릴게요. 엄격한 정의는 놀라울 만큼 어렵기 때문에 아래의 설명으로도 충분히 목적이 달성될 것 같습니다.

     

    C에서의 lvalue와 rvalue의 원래 정의는 다음과 같습니다. lvalue는 할당 연산에서 왼쪽과 오른쪽 모두 올 수 있는 표현식인 반면, rvalue는 오직 할당 연산에서 오직 오른쪽에만 올 수 있는 표현식이다. 예시로 확인해보겠습니다.

      int a = 42;
      int b = 43;
    
      // a and b are both l-values:
      a = b; // ok
      b = a; // ok
      a = a * b; // ok
    
      // a * b is an rvalue:
      int c = a * b; // ok, rvalue on right hand side of assignment
      a * b = 42; // error, rvalue on left hand side of assignment

     

    C++에서도 이 개념이 유용했었지만, 사용자 정의 타입이 수정 용이성과 할당 가능성에 관해 어떤 미묘함을 도입하면서 기존의 lvalue, rvalue가 정의가 바뀌어버렸습니다. 깊게 들어갈 필요도 없습니다. 여전히 논쟁거리이긴 하지만, rvalue reference를 따져보게 되는 대안적 성격의 정의가 여기에 있습니다. lvalue는 메모리 위치를 참조하고 주소 연산자를 통해 주소를 취할 수 있는 표현식이다. rvalue는 lvalue가 아닌 표현식이다. 예제를 보시죠.

      // lvalues:
      //
      int i = 42;
      i = 43; // ok, i is an lvalue
      int* p = &i; // ok, i is an lvalue
      int& foo();
      foo() = 42; // ok, foo() is an lvalue
      int* p1 = &foo(); // ok, foo() is an lvalue
    
      // rvalues:
      //
      int foobar();
      int j = 0;
      j = foobar(); // ok, foobar() is an rvalue
      int* p2 = &foobar(); // error, cannot take the address of an rvalue
      j = 42; // ok, 42 is an rvalue

    댓글

Designed by Tistory.