Funktionsaufruf ist nicht eindeutig, aber warum?

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; 
}

Der Aufruf von 'x' ist im Apple Clang Compiler nicht eindeutig. Warum?

Für x (int, int) ist das erste Argument eine direkte Übereinstimmung und das zweite eine Werbung für x (char, char). Das erste Argument ist eine Standardkonvertierung, wie ich weiß, und auch gemäß dieser Antwort-> https://stackoverflow.com/a/28184631/13023201

Und Promotion sollte der Standardkonvertierung vorgezogen werden, dann sollte x (int, int) aufgerufen werden. Warum ist das dann mehrdeutig?

Antworten

8 NathanPierson Dec 12 2020 at 15:51

Schauen Sie sich an, wie cppreference den Überlastungsauflösungsprozess beschreibt:

Beste brauchbare Funktion

Für jedes Paar funktionsfähiger Funktionen F1 und F2 werden die impliziten Konvertierungssequenzen vom i-th-Argument zum i-th-Parameter eingestuft, um zu bestimmen, welches besser ist (mit Ausnahme des ersten Arguments hat das implizite Objektargument für statische Elementfunktionen keine Auswirkung auf das Rangfolge)

F1 wird als bessere Funktion als F2 bestimmt, wenn implizite Konvertierungen für alle Argumente von F1 nicht schlechter sind als die impliziten Konvertierungen für alle Argumente von F2 und

...

x(int, int)ist eine bessere Übereinstimmung als x(char, char)für das erste Argument, da intto inteine exakte Übereinstimmung und intto chareine Konvertierung ist. Aber x(int, int)ist eine schlechtere Übereinstimmung für das zweite Argument, weil es eine Beförderung anstelle einer genauen Übereinstimmung ist. Daher passt keine Funktion besser als die andere und die Überlastung kann nicht behoben werden.