Notice
Recent Posts
Recent Comments
Link
오븐 노트
[C++] 전달 참조 (forwarding reference) 본문
#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 |