ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 우측값 참조로 받은 값은 우측값일까?
    프로그래밍/c++ 2015. 3. 25. 17:12
    반응형


    우측값 참조로 받은 값은 우측값일까?

    나는 우측값을 처음 사용했을 때 우측값으로 받았으니 당연히 우측값이겠지! 라고 생각했었다. 마치 래퍼런스처럼 -_-;

    하지만 전혀 그렇지 않았다.

    왜 그럴까 자료를 찾아보던 중 이런 문구를 발견했다.


    "우측값 참조를 설계한 사람들은 우측값 참조라 정의한 것들도 좌측값, 우측값이 될 수 있다고 했다." 


    이 뭔 x소리야??란 생각이 들었는데, 상황은 다음과 같다


    1
    2
    3
    4
    5
    6
    7
    c.push_back(std::string("Hello!")); // it's right value!
     
    void c::push_back(std::string&& str) // it's left value
    {
      ...
    }
     



    위 c.push_back(...)은 우측값이고, 아래의 c::push_back(... str)은 우측값이다.

    우측값이라도 이름이 있으면! 좌측값으로 인식이 된다는 것이 포인트이다.(이 값은 우측값일수도, 좌측값일수도 있습니다.)

    1번 라인의 std::string("Hello!")는 이름이 없는 임시값이지만

    3번 라인의 std::string&& str은 str이라는 이름이 붙은 값이다. 

    따라서 그대로 사용하면 좌측값으로 인식을 한다.

    이 문제 때문에 우측값을 값으로 받는 함수에서는 std::move를 통해 이 str은 우측값이야! 라는걸 명시해주어야한다.


    그래서 std::move는 내부적으로 어떻게 구현이 되어있을까 궁금했다.


    1
    2
    3
    4
    5
    template < typename Type >
    inline typename remove_reference<Type>::type&& move(Type&& arg)
    {
      return ((typename remove_reference<Type>::type&&)(val);
    }



    ... 이런식으로 함수의 반환 값은 이름이 없는것을 이용해 우측값으로 만드는 것이었다.

    반응형

    '프로그래밍 > c++' 카테고리의 다른 글

    unsinged int와 size_t  (0) 2015.03.31
    배열의 최대 길이에 관하여  (0) 2015.03.31
    [c++14] shared_mutex와 shared_lock의 사용  (0) 2015.03.24
    std::decay<T>의 사용  (0) 2015.03.04
    [c++] 코드 스크랩  (0) 2015.02.24
Designed by Tistory.