Mordern C++ 전달 참조

CJB_ny·2022년 8월 29일
0

C++ 정리

목록 보기
81/95
post-thumbnail

전달 참조

원래는 '보편 참조' (universal reference)

-> '전달 참조' (forwarding reference) C++17

(거의 활용할 일이 없기는 한데 사용한다 서버에서)

이렇게 일단 만들어 주도록 하자.


이런식으로 막바로 안된다.

k1은 왼값이기 때문에

move로 오른값으로 캐스팅 해주어야 가능하다.

그래서 오른값 참조를 이용을 하면은

해당 원본데이터를 유지할 필요 없이 이동대상이라는 힌트를 주는 것이다.

그렇다면

이렇게 '&&'가 두번 등장하면 무조건 오른값 참조라고 봐야하나?

오늘의 주제이다.

'전달 참조'가 특히

'template', 'auto'와 같이 '형식 연역'이라고 해가지고

type deduce가 발생할 때, 타입을 갱신?을 하는 상황이

발생할 때 '전달 참조'가 자주 발생한다고 보면 된다.

이까지는 자동추론을 통해 Knight&&라고 잘 나온다.

이런경우말고

왼값만 덩그러니 전달해준다고 해보자.

경우에 따라서 왼값 참조로도 될 수도 있다.

auto&&

auto를 사용할 때도 이런 상황이 발생을 한다.

이거 오른값 참조가 아닌가 생각할 수 있는데

보면은 왼값 참조이다.

std::move로하면 오른값 참조로 변환이 된다.

이거 template, auto일 경우에만 '전달 참조'가 발생하는 상황이다.

  • 공통점 :

    형식 연역 (type deduction)이 일어날 때

그래서 왼값 넣어주면 왼값으로 동작하고 오른값 넣어주면 오른값으로 동작을 한다.

중요 ❗

여기에서

오른값을 받는 함수의 인자에 오른값 참조를 넣어주면 에러난다.

구별 해야한다.

오른값과 오른값 참조를..

  • 오른값

    왼값이 아니다 = 단일식에서 벗어나면 사용못한다.

  • 오른값 참조

    오른값만 참조할 수 있는 참조 타입

현재 k5는 '오른값 참조'이다 보니까 그냥 k1을 넣어 줄 수 없었고 std::move를 통해서

캐스팅해서 k1을 오른값으로 바꿔 준다음에 k5에 넣어주는것 까지는 말이되는데

(k5는 현재 오른값 참조인 것까지 알 수 있다.)

그런데 k5가 '오른값'이냐? 하는 것은 다른 문제이다.

std::move로 오른값을 추출을 해서

Test_RValueRef에 넘겨 주어야지만,

이제 정상적으로 문법이 실행된다.

함수 재정의

그런데 이럴경우 에러난다.

forward의 T타입이 뭔지 몰라서 발생하는 문제이다.

그래서 이렇게 수정하자.

정리

함수를 이렇게

하나만 만들어 주었는데 경우에 따라서 왼값, 오른값이 다 들어갈 수 있는 이유가

복사 방식으로 전달하기도 하고 어떤 경우는 이동방식으로 전달하기도 하기때문인데

이것이 가능한 이유는 '전달 참조'라는 새로운 문법이 있기 때문이다.

'전달 참조'는 template, auto와 관련된 '형식 연역'이 있을 경우 사용할 수 있다.

그래서 원본값이 왼값인지 오른값인지에 따라서

다시한번 이렇게 바꿔치기를 해준다.

바꿔치기를 하는 부분은 그냥 forward 함수를 사용하면된다.

'전달 참조'는 무조건 'std::forward'사용.

profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글