5
initlializer_list 나는 다음과 같은 함수 템플릿이 있습니다기능 템플릿 공제 및
template <typename K, typename V>
void f(std::initializer_list<std::pair<const K, V>> il)
{
//...
}
다음과 같이 내가 함수를 호출 :
f({std::pair<const int,int>(1,2), std::pair<const int,int>(3,4)}); //(a)
을하고 잘 작동합니다. 올바른 유형을 추론 할 수 없습니다
f({{1,2}, {3,4}}); //(b)
는, 나는의 라인을 따라 컴파일 오류가 얻을 : 나는 시도하고 그것을 호출하는 경우
그러나, 다음과 같이
'no matching function for call to 'f(<brace-enclose initializer list>)
note candidate is:
note: template <class K, class V> void f(std::initializer_list<std::pair<const K, V>>)'
을 내가 다음과 같이 호출하면 :
f({std::pair<const int,int>(1,2), {3,4}}); //(c)
형식 공제가 작동하지만 다음과 같이 호출하면이를 호출합니다.
f({std::make_pair(1,2), {3,4}}); //(d)
이전과 같은 컴파일 오류가 발생합니다.
내 질문은 :
이유는 무엇입니까 (C)에서 템플릿 형태 추론 일 수 있지만 (d)에?
나는 비슷한 살펴 보았다, 나이 SO 게시물 (컴파일러 플래그 -std = C++ 11, GCC v4.6.3입니다)하지만 그들은 확실히이 질문에 대답을하지 않은 것으로 보입니다.
쌍의 첫 번째 부분에 대해
const int
을 생성하지 않습니다. 그렇지만 b)에서 make_pair의 비 const int를 잊어 버릴 수는 없습니다. 감사. – TPJ'{1,2}'은 (는)'initializer_list''에 대해 취해지지 않습니다. 'initializer_list '과 쌍을 이루지 않는 한 추론하지 않습니다. 차이점이 있습니다 (컴파일러가 모든 경우에'{1, 2}'에서'initializer_list '을 실제로 추론하면 (c) 컴파일되지 않습니다). –
나는 문장을 고쳐 썼다, 고마워! –