-
항목28. 참조 축약을 숙지하라Effective Modern C++ 2022. 9. 7. 18:57
template<typename T> void func(T&& param); // 보편 참조func에 왼값 인수가 전달되면 T는 왼값 참조로 연역, 오른값 인수가 전달되면 T는 비참조 형식으로 연역.
(왼값 => T 는 형식&로 연역, 오른값 => T는 [형식]으로 연역)
왼값이 들어오면 void func(Widget& && param); 같은 형태가 된다. 여기서 참조 축약이 발생 Widget& &&은 =>Widget&가 된다.
참조 축약 : 참조에 대한 참조가 허용된 문맥에서, 두 참조 중 하나라도 왼값 참조이면 두 참조는 하나의 왼값 참조로 축약된다. 그렇지 않고 둘 다 오른값 참조이면 결과는 오른 값 참조이다.
오른값이 들어오면 void func(Widget&& param); (참조 축약 X)
std::forward는 T의 이런 부호화를 바탕으로 캐스팅을 한다.
auto&& 도 T&&과 똑같이 작동한다.
template<typename T> class Widget{ public: typedef T&& RvalueRefToT; ...}typedef에서도 참조 축약이 발생한다.
마지막으로 decltype사용 중에도 참조 축약이 발생한다.
'Effective Modern C++' 카테고리의 다른 글
항목29. 이동 연산이 존재하지 않고, 저렴하지 않고, 적용되지 않는다고 가정하라 (0) 2022.09.24 항목27. 보편 참조에 대한 중복적재 대신 사용할 수 있는 기법들을 알아 두라 (0) 2022.09.06 항목26. 보편 참조에 대한 중복적재를 피하라 (0) 2022.09.06 항목25. 오른값 참조에는 std::move를, 보편 참조에는 std::forward를 사용하라 (0) 2022.08.27 항목24. 보편 참조와 오른값 참조를 구별하라 (0) 2022.08.27