반응형
보편 참조 == 전달참조
보편 참조라는 이름이 c++17로 오면서 전달 참조라고 바뀜
전달 참조가 무엇이냐!
코드 부터 보겠음
template<typename T>
void Test_ForwardingRef(T&& param)
{
}
&&가 두개.. 오른값을 인자로 받는 코드인가??
오른값(rvalue)과 이동 대입 연산자
value는 두개로 나뉠 수 있는데 하나는 왼값( lvalue ) 또 하나는 오른값( rvalue ) int a = 5; 위 코드에서 a가 왼값이고 5가 오른값이라고 할 수 있음 즉 왼값은 - 단일식을 넘어서 계속 지속되는 개체를
flrjtwjrjt.tistory.com
Knight k1;
Test_ForwardingRef(k1);
Test_ForwardingRef(std::move(k1));
하지만 왼값, 오른값 둘 다 들어감..!
사실 T&&는 전달 참조로 왼값과 오른값 둘 다 받는 형식임
전달 참조
- 왼값을 넣어주면 왼값으로, 오른값을 넣어주면 오른값으로 동작함
void Test_Copy(Knight k)
{
}
template<typename T>
void Test_ForwardingRef(T&& param)
{
Test_Copy(std::move(param)); // 왼값이 올 수도 있기 때문에 사용하면 안됨
Test_Copy(param); // 오른값이 올 수도 있기 때문에 사용하면 안됨
}
그렇다면 위와 같은 문제가 생김
왼값이면 왼값에 맞는 내용을
오른값이면 오른값에 맞는 내용을 적어야하는데
뭐가 올지 모른다는거임!!
그럴때 사용하는게 바로 forward!
forward
class Knight
{
public:
Knight() { cout << "기본 생성자" << endl; }
Knight(const Knight&) { cout << "복사 생성자" << endl; }
Knight(Knight&&) noexcept { cout << "이동 생성자" << endl; }
};
template<typename T>
void Test_ForwardingRef(T&& param)
{
// 왼값 참조라면 복사 생성자가 실행
// 오른값 참조라면 이동 생성자가 실행
Test_Copy(std::forward<T>(param));
}
forward를 사용하면 왼값인지 오른값인지 구분해서 알잘딱 해줌!
이러한 forward의 특성 때문에
forward와 전달 참조는 항상 붙어다닌다고 알고 있으면 됨
반응형
LIST
'프로그래밍 > C++' 카테고리의 다른 글
스마트 포인터 (0) | 2022.11.10 |
---|---|
C++ Lambda (0) | 2022.11.10 |
오른값(rvalue)과 이동 대입 연산자 (0) | 2022.11.09 |
using, typedef (0) | 2022.11.09 |
중괄호 초기화와 initializer_list (0) | 2022.11.08 |