함수 호출이 모호하지만 그 이유는 무엇입니까?

Dec 12 2020
#include <iostream>
using namespace std;

void x(int a,int b){
  cout<<"int int"<<endl;
}
void x(char a,char b){
  cout<<"char char"<<endl;
}

int main() {
  int a =2;char c ='a';
  x(a,c);
  return 0; 
}

'x'에 대한 호출이 apple clang 컴파일러에서 모호합니다. 이유는 무엇입니까?

x (int, int)의 경우 첫 번째 인수는 직접 일치이고 두 번째는 x (char, char)에 대한 승진입니다. 첫 번째 인수는 내가 아는 바와 같이 표준 변환 이며이 답변에 따르면-> https://stackoverflow.com/a/28184631/13023201

그리고 승격은 표준 변환보다 선호되어야하며 x (int, int)가 호출되어야합니다. 그럼 왜 모호해 ??

답변

8 NathanPierson Dec 12 2020 at 15:51

cppreference 가 오버로드 해결 프로세스를 설명하는 방법을 살펴 봅니다 .

최고의 기능

실행 가능한 함수 F1 및 F2의 각 쌍에 대해 i-th 인수에서 i-th 매개 변수로 의 암시 적 변환 시퀀스 가 순위가 매겨져 어느 것이 더 좋은지 결정됩니다 (첫 번째 인수를 제외하고 정적 멤버 함수에 대한 암시 적 개체 인수 는 순위)

F1의 모든 인수에 대한 암시 적 변환이 F2의 모든 인수에 대한 암시 적 변환보다 나쁘지 않은 경우 F1은 F2보다 더 나은 함수로 결정됩니다.

...

x(int, int)to 는 정확히 일치하고 to 는 변환 x(char, char)이므로 첫 번째 인수 보다 더 잘 일치 합니다. 그러나 A는 나쁜 대신 정확하게 일치의 증진이기 때문에, 두 번째 인수에 대한 일치합니다. 따라서 어느 기능 도 다른 기능보다 더 잘 일치하지 않으며 과부하를 해결할 수 없습니다.intintintcharx(int, int)