다음 코드는 gcc와 clang으로 잘 컴파일됩니다. 오버로드 확인이 첫 번째 오버로드합니다 (identity<T>::type
하나를) 선택처럼왜 이러한 과부하가 모호하지 않습니까?
template <typename T>
struct identity
{
typedef T type;
};
template <typename T>
void foo(typename identity<T>::type);
template <typename T>
void foo(T);
int main()
{
foo<int>(0);
}
것 같습니다.
과부하가 모호하지 않은 이유를 설명 할 수 있습니까? 내가 말할 수있는 한, 유일한 차이점은 첫 번째 인수가 추론되지 않은 컨텍스트이고 두 번째 인수의 인수가 아니라는 점입니다. 그러나 템플릿 인수를 명시 적으로 제공하고 있으므로 필자는 왜 그것이 중요해야하는지 알지 못한다.
흥미 롭습니다. 분명히'foo (0)'이 아니라'foo (0)'을 명시 적으로 인스턴스화하지 않아서 유형 공제를 가능하게 한 경우 두 번째 함수가 선택되었을 것입니다 (신원 메타 함수에 대한 유형 공제가 없음)[email protected] 앤디 프록 (Anty Prowl) : 당신의 대답에 의문을 제기하고 싶지는 않습니다. foo 매개 변수에 기본값을주고 매개 변수없이'foo ()'을 호출하십시오. 귀하의 논쟁은 여전히 적용되어야하지만, 과부하는 실제로 HighCommander4가 예상 한 것처럼 모호합니다. 함수 템플릿의 명시 적 템플릿 인스턴스화는 복잡합니다. –