2014-09-14 14 views
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입니다)하지만 그들은 확실히이 질문에 대답을하지 않은 것으로 보입니다.

답변

4

B와 문제) 컴파일러가 가

{1,2} 
가 뿐만 아니라 initializer_list<int>에 대해 수행 될 수있다, D의 문제가)

같은 것을하기 때문에 유형을 추론 할 수없는 것입니다 그 make_pair

+0

쌍의 첫 번째 부분에 대해 const int을 생성하지 않습니다. 그렇지만 b)에서 make_pair의 비 const int를 잊어 버릴 수는 없습니다. 감사. – TPJ

+0

'{1,2}'은 (는)'initializer_list ''에 대해 취해지지 않습니다. 'initializer_list '과 쌍을 이루지 않는 한 추론하지 않습니다. 차이점이 있습니다 (컴파일러가 모든 경우에'{1, 2}'에서'initializer_list '을 실제로 추론하면 (c) 컴파일되지 않습니다). –

+0

나는 문장을 고쳐 썼다, 고마워! –