보편참조 관련 질문
194
작성한 질문수 4

강의 내용 22:00에 보편참조라고 설명해 주시면서
Job 생성자를 만들어주셨습니다.

하지만 Job생성자는 우측값 참조가 아니면 생성이 되지 않습니다.
반면에 우측값 참조로 넣어주면 전부 에러 없이 생성되었습니다
Job 생성자가 보편참조라면 좌측값인 player로도 생성이 되어야 하지 않나요?

만약 Job 생성자가 보편참조가 아니라면
GRoom->PushJob(&Room::Enter, player) 부분에서

보편참조가 아닌 함수에서 L-value를 std::forward를 사용하면 오른쪽 참조값으로 바뀌기 때문에
auto job = ObjectPool<Job>::MakeShared(owner, memFunc, std::forward<Args>(args)...);
이함수는 결국 우측값 참조를 받는 Job생성자를 호출하게 되어 Job을 만들어 주었기 때문에 에러가 발생하지 않고 잘 실행 되었던거라고 이해하면 될까요?
만약 Job생성자가 보편참조가 아니라면 왜 보편참조가 될 수 없나요?
강의 핵심내용은 JobQueue에 관한 내용이지만
보편참조가 너무 헷갈려서 질문하게 되었습니다..
답변 1
0
저도 같은 부분에 궁금증을 가져서 삽질해본 결과 그나마 합리적인 추측을 할 수 있었습니다.
1. Job 생성자의 마지막 인자 Args&&... arg는 보편 참조가 아닙니다. 그 이유는 앞선 두 번째 인자인 Ret(T::* memFunc)(Args...) 에서 Args가 먼저 추론되고 이후 마지막 인자인 Args는 추론이 되지 않습니다. (non-deduced) 즉, 이미 추론된 타입에 &&가 붙게 됩니다. 이 말은 마지막 인자는 항상 rvalue reference가 된다는 의미이죠.
2. std::forward는 템플릿 인자 T에 참조가 붙지 않으면 rvalue로 캐스팅하여 리턴해줍니다.
PushJob의 정의를 보면 Args는 보편참조가 아닌 일반 lvalue만을 받는 템플릿 형식입니다. 여기서 받은 비참조 타입 lvalue를 forward를 통해 rvalue로 캐스팅한 후 MakeShared에 넘겨주고, 이 안에서는 계속 perfect forwarding을 통해 값 카테고리를 보존한 채 placement new(생성자 호출)까지 도달하게 됩니다.
아마 테스트에서 std::forward<PlayerRef&>(player)를 Job 생성자에 바로 넣어주면 똑같이 컴파일 에러가 나올겁니다.
3. 1번의 답변과 일맥상통 할 것 같습니다.
저는 이와 같이 이해하고 넘어가려 하며 정확하지 않은 정보일 수 있으니 더 정확한 정보를 위해서는 cppreference의 템플릿 추론 규칙 아티클이나 모던 c++의 템플릿 추론 챕터를 읽어보는 것을 추천드립니다!
Memory Pool에서 오버플로우 질문입니다.
0
63
2
포토폴리오 및 진로 관련하여 고민입니다.
0
112
1
포토폴리오 관련 고민입니다.
0
62
1
실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.
0
82
2
성능 테스트 결과
0
103
2
게임 서버 Stateful, Stateless 진로 고민
0
121
1
WaitOnAddress와 Sleep의 차이 질문
0
83
1
궁금한거 있습니다.
0
82
2
JobTimer 구동 스레드
0
107
2
TryPop() 동작 관련 질문
0
81
1
로드맵 C#서버 C++서버 방향성 질문
0
148
2
스레드 id를 출력할떄 메인스레드 id도 출력되나요?
0
73
1
생명주기를 위한 의도적 복사
0
86
2
락프리의 실무에서 사용 질문
0
139
2
32bit threadID와 16비트 상위 WriteFlag에 대해
0
101
2
mutex와 sleep 차이점
0
117
1
실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다
0
152
2
Stomp Allocator의 Release함수에 대한 질문입니다.
0
96
1
공부법 관련해서
0
183
2
MakeShared 함수 관련
0
114
1
지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.
0
144
2
운영체제관련 질문입니다
0
131
1
send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.
0
117
2
메모리 풀 질문있습니다.
0
124
1





