-
항목24. 보편 참조와 오른값 참조를 구별하라Effective Modern C++ 2022. 8. 27. 14:47
책에는 보편 참조(universal reference)라 나오지만 일반적으로 전달 참조(forwarding reference)라고 한다.
void f(Widget&& param); // 형식 연역 없음 (오른값 참조) Widget&& var1 = Widget(); // 형식 연역 없음 (오른값 참조) template<typename T> void f(T&& param); // param은 보편 참조 auto&& var = var1 // var는 보편 참조이 두 보편 참조 문맥의 공통점은 형식 연역이 일어난다는 점이다. 보편 참초가 오른값 참조인지 왼값 참조인지를 나타내는지는 보편 참조의 초기치가 결정한다. 보편 참조가 함수의 매개변수인 경우, 초기치는 그 함수를 호출하는 지점에서 제공한다.
f(w); // f에 왼값이 전달됨; 왼값 참조 f(std::move(w)); // f에 오른값이 전달됨; 오른값 참조또한 형태도 정확해야한다. T&&의 형태이어야 한다.("형식&&")
template<typename T> void f(std::vector<T>&& param); // param은 오른값 참조 template<typename T> void f1(const T&& param); // param은 오른값 참조std::vetor의 push_back의 매개변수는 T&&이다.
... public: void push_back(T&& x); ...하지만 std::vector는 구체적으로 인스턴스화된 vector의 일부이다.
std::vector<Widget> v; class vector<Widget,allocator<Widget>> { public: void push_back(Widget&& x); // 오른값 참조 ... }그래서 항상 T에 대한 오른값 참조 형식의 매개변수를 선언한다.
'Effective Modern C++' 카테고리의 다른 글
항목26. 보편 참조에 대한 중복적재를 피하라 (0) 2022.09.06 항목25. 오른값 참조에는 std::move를, 보편 참조에는 std::forward를 사용하라 (0) 2022.08.27 항목23. std::move와 std::forward를 숙지하라 (0) 2022.08.20 항목22. Pimpl 관용구를 사용할 때에는 특수 멤버 함수들을 구현 파일에서 정의하라 (0) 2022.08.16 항목21. new를 직접 사용하는 것보다 std::make_unique와 std::make_shared를 선호하라 (0) 2022.08.11