-
우측값 참조로 받은 값은 우측값일까?프로그래밍/c++ 2015. 3. 25. 17:12반응형
우측값 참조로 받은 값은 우측값일까?
나는 우측값을 처음 사용했을 때 우측값으로 받았으니 당연히 우측값이겠지! 라고 생각했었다. 마치 래퍼런스처럼 -_-;
하지만 전혀 그렇지 않았다.
왜 그럴까 자료를 찾아보던 중 이런 문구를 발견했다.
"우측값 참조를 설계한 사람들은 우측값 참조라 정의한 것들도 좌측값, 우측값이 될 수 있다고 했다."
이 뭔 x소리야??란 생각이 들었는데, 상황은 다음과 같다
1234567c.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는 내부적으로 어떻게 구현이 되어있을까 궁금했다.
12345template < 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