2014-09-13 1 views
3

컴파일러가 최상의 후보를 선택하는 방법을 이해하지 못합니다. 예를 들어 ,의 다음 코드를 보자 : 두 번째 함수는 두 개의 변수를 변환해야하고, 첫 번째는 하나 개의 변수를 변환하는 경우함수 오버로딩에서 암시 적 변환 시퀀스

int function(double, int, int){...} 
int function(int, double, double){...} 

을 어떻게 첫 번째 선택하지 않는 거지? 왜 모호한 상황입니까?

+3

4 개의 매개 변수가 있고 다른 하나의 매개 변수가 더 좋으면 하나는 더 좋고 나머지 두 개는 더 좋으면 초과 근무 시간에 들어가서 페널티 샷을 수행합니까? 더 나은 일치는 모든 매개 변수에서 더 좋거나 같아야합니다. 그것은 포인트에 대한 경쟁이 아닙니다. –

답변

2

왜 모호한 상황입니까? 이러한 정의 감안할 때 §13.3.3/1에 따르면

,

이 가능한 기능 F1 다른 가능한 기능보다 더 나은 기능 모든 인수에 대한 F2경우로 정의된다 i, ICS i (F1)은 보다 나쁜 변환 시퀀스가 ​​아닙니다. ICS i ()하고

- 일부 인수 J, ICS J (F1) 용은 ICS J (F2)보다 더 나은 변환 시퀀스이거나 아닌 그 경우

- [...]

따라서 function(0., 0., 0.)과 같은 호출은 모호합니다. 과부하도 다른 것보다 나은 일치는 아닙니다.

함수 호출에서 템플릿 인수 공제를 고려 - 템플릿 매개 변수 T이 (T a, T b, T c을 같은) 여러 함수 매개 변수에 사용하는 경우와이 int으로 추론하지만, double으로 세 번째입니다 전화의 인수의 두 , 실제로는 T=int으로 성공적인 공제가 이루어져야합니까?

오버로드 해상도는 더 나은 성냥을 계산하지 않고 승자를 호출합니다. 이는 충분히 결정적인 것은 아닙니다.

지그 소 퍼즐을 상상해보십시오. 두 끝에서 더 잘 채워지지만 다른 끝에서 더 채워지면 차이가 더 잘 어울립니다.