1 minute read

forwarding reference(universal reference)가 있게 한 제안서(proposal)다. std::forward() 함수를 보면 생각날 문서다.

받은 인자를 수정 없이 어디론가 넘겨주는 걸 forwarding이라고 한다. 용어를 몰라도 std::make_unique() 함수로 이미 사용하고 있다.

받은 걸 그대로 넘겨준다. 간단해 보이는데 이게 C++11 이전에는 불가능했다. rvalue reference가 없었기 때문. rvalue를 그대로 넘겨줄 방법이 없다. 타입 연역(type deduction) 과정에서 rvalue reference에 reference collapsing을 사용해 타입을 그대로 전달한다.

C++ 오래 썼는데, forwarding 문제를 못 느낀 건 자괴감이 든다. 이런 것에서 내공 차이가 나나 보다. 주로 non-const reference로 non-const rvalue는 배 째는 방식을 선택했던 거로 기억한다.

forwarding method 7개를 설명한다. 많기도 많네. 문제점을 다 짚어주는 이런 설명이 재미 없을 리가 없다. 이런 게 설득을 기반으로 한 제안서를 읽는 재미다.

const int const_rval() { return 0; }

non-const reference를 사용하면 const rvalue가 const lvalue로 바인딩 된다고 한다. 테스트 코드를 만드는데, 컴파일 에러가 발생. 어떤 걸 잘못한 거지?

struct A {};
const A const_rval() { return {}; }

const prvalue는 불가능하다. 그래 맞다. 이렇게 함수를 정의하고 테스트하니깐 const lvalue로 바인딩 되더라.

링크