#review #cpp n1385 The Forwarding Problem: Arguments 제안서
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로 바인딩 되더라.
링크
- Effective Modern C++ (스콧 마이어스, 2015) 독후감 - ohyecloudy’s pnotes - ohyecloudy.com(archive) Item 23, 24, 25, 26, 27, 28, 30
- Universal References in C++11 – Scott Meyers : Standard C++ - isocpp.org(archive)
- Reference declaration - cppreference.com - en.cppreference.com(archive)
- std::forward - cppreference.com - en.cppreference.com(archive)
- Value categories - cppreference.com - en.cppreference.com(archive)
- std::make_unique, std::make_unique_for_overwrite - cppreference.com - en.cppr…(archive)
- The Forwarding Problem: Arguments - open-std.org(archive)