l 값을 std :: make_pair에 어떻게 전달할 수 있습니까?
년 std::make_pair
이후 단 하나의 구현 C ++ (14)가
template <클래스 T1, 클래스 T2> constexpr std :: pair <V1, V2> make_pair (T1 && t, T2 && u);
두 매개 변수 R 값 참조로,에 따라 이
R 값 참조는 l 값으로 초기화 할 수 없습니다.
int i = 1;
char ch = 'a';
std::unordered_map<int, char> mp;
mp.insert(make_pair<int,char>(i, ch));
따라서 위 코드에서와 같이 make_pair를 사용하려고하면 올바르게 오류가 발생 error: cannot bind rvalue reference of type 'int&&' to lvalue of type 'int'
합니다.
그러나 템플릿 인수를 삭제하고 다음과 같이 호출하면 위 코드에서 완벽하게 작동합니다.
mp.insert(make_pair(i, ch));
나는 이것이 어떻게 작동하는지 혼동하고있어 i
및 ch
모두 L-값입니다. 템플릿 인수 확인이 L- 값을 R- 값으로 변환합니까 아니면 어떻게 작동합니까?
답변
의 매개 변수는 make_pair
rvalue-reference로 선언되지 않고 참조를 전달합니다 .
전달 참조는 함수 인수의 값 범주를 보존하는 특수한 종류의 참조이며 std :: forward를 통해 전달할 수 있습니다. 전달 참조는 다음 중 하나입니다.
- 동일한 함수 템플릿의 cv-unqualified 유형 템플릿 매개 변수에 대한 rvalue 참조로 선언 된 함수 템플릿의 함수 매개 변수 :
전달 참조는 템플릿 인수 추론 의 도움으로 lvalue 및 rvalue 모두에서 작동합니다 . lvalue가 전달 될 때 템플릿 매개 변수는 lvalue-reference로 추론되고 참조 축소 후 함수 매개 변수도 lvalue-reference입니다. rvalue를 전달할 때 템플릿 매개 변수는 비 참조로 추론되고 함수 매개 변수는 rvalue-reference입니다.
반면에 템플릿 인수를 명시 적으로 지정 make_pair<int,char>(...)
하면 함수 매개 변수가 그에 따라 rvalue-reference가됩니다.
songyuanyao 의 대답은 이미 무슨 일이 일어나고 있는지 대부분을 설명합니다. 하지만 명시적인 템플릿 인수를 사용하여이 작업을 수행하는 방법에 기여하고 싶습니다. 당신은 그곳에 거의 다 왔지만 마지막 단계를 밟지 않았습니다.
나는 이것이 어떻게 작동하는지 혼동하고있어
i
및ch
모두 L-값입니다.
바로 그거죠. 템플릿 인수에 지정할 수있는 l- 값을 원합니다.
std::make_pair<int &, char &>(i, ch)
또는 더 많은 경우에 작동하는 양식 :
std::make_pair<const int &, const char &>(i, ch)
약간의 추가 작성이지만 어떤 이유로 인수 추론이 실패하는 경우 필요합니다.