6

나는 다음과 같은 이상한 행동을 관찰 4.7 : 사용자 정의 변환이 필요한 경우C++ 과부하 해상도, - 정의 변환 기능 템플릿 g ++ 3.4으로

는 함수 템플릿이 일치하지 않는 경우 일반 함수가됩니다. C++ 98 표준에서 해당 규칙을 찾을 수 없습니다. g ++가 맞습니까? (가정 할 때)? 아니면 버그입니까?

template <class T> 
int x(auto_ptr_ref<T> p) 
{ 
    return 1; 
} 
// this would match 
/* 
int x(auto_ptr_ref<int> p) 
{ 
    return 2; 
} 
*/ 
void dummy() 
{ 
    cout << x(auto_ptr<int>()) << endl; 
} 

답변

7

GCC가 정확하면 template argument deduction은 암시 적 변환을 고려하지 않습니다.

유형 공제는 암시 적 변환 (위에 나열된 유형 조정 제외)을 고려하지 않습니다. 즉, 과부하 해결을위한 작업입니다. 나중에 발생합니다. 코드에 대한

, auto_ptr_refauto_ptr에 대한 템플릿 매개 변수 T 실패의 공제를 일치하지 않기 때문에 함수 템플릿 x()는 모든 오버로드 확인을 위해 고려되지 않습니다.