오븐 노트

[C++] 전달 참조 (forwarding reference) 본문

Develop/C++

[C++] 전달 참조 (forwarding reference)

오 븐 2024. 1. 2. 19:22
#include <iostream>
using namespace std;
#include <vector>
#include <list>
#include <deque>
#include <map>
#include <set>
#include <algorithm>

class Knight
{
public:
	Knight() { cout << "기본 생성자" << endl; }
	Knight(const Knight&) { cout << "복사 생성자" << endl; }
	Knight(Knight&&) noexcept { cout << "이동 생성자" << endl; }
};

void Test_RValueRef(Knight&& k) // 오른값 참조
{

}

void Test_Copy(Knight k)
{

}

template<typename T>
void Test_ForwardingRef(T&& param) // 전달 참조
{
	// 넘겨준 값이 왼값 참조라면 복사 // Test_Copy(param);
	// 오른값 참조라면 이동 // Test_Copy(std::move(param));
	Test_Copy(std::forward<T>(param)); // 전달 참조는 forward 자동으로 연계하여 기억, 사용 // 알맞는 사용을 찾아주는 함수

}

int main()
{
	// 보편 참조(universal reference)

	// 전달 참조(forwarding reference) C++17
	// 템플릿, auto와 관련된 추론이 일어나는 경우에 활용한다.


	// &&	&를 두 번 -> 오른값 참조

	Knight k1;

	Test_RValueRef(std::move(k1)); // rvalue_cast

	//Test_ForwardingRef(k1);
	//Test_ForwardingRef(std::move(k1));

	auto&& k2 = k1;
	auto&& k3 = std::move(k1);

	// 공통점 : 형식 연역(type deduction)이 일어날 때

	// 전달 참조를 구별하는 방법
	// ------------------------

	Knight& k4 = k1; // 왼값 참조
	Knight&& k5 = std::move(k1); // 오른값 참조

	// 오른값 : 왼값이 아니다 = 단일식에서 벗어나면 사용 X
	// 오른값 참조 : 오른값만 참조할 수 있는 참조 타입
	//Test_RValueRef(std::move(k5));

	// 오른값 참조라는 타입 자체가 원본 자체를 참조하고 있으며, 원본 자체가 훼손되어도 상관없다고 하고있지만, 받아주는 쪽 자체가 오른값은 아니다.

	Test_ForwardingRef(k1);
	Test_ForwardingRef(std::move(k1));

	return 0;
}

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의
 
C++ 카테고리의 글은 인프런 Rookiss님의 강의를 공부하며 정리하는 내용입니다.
이미 알고 있는 내용도 다시 정리 되어있을 수 있습니다.

 

모든 글은 제가 공부하기 위해 작성합니다.

'Develop > C++' 카테고리의 다른 글

[C++] 스마트 포인터 (smart pointer)  (0) 2024.01.04
[C++] 람다 (lambda)  (0) 2024.01.02
[C++] 오른값 참조 (rvalue reference)  (0) 2023.12.30
[C++] override, final  (0) 2023.12.28
[C++] delete(삭제된 함수)  (0) 2023.12.13