Das folgende Programm kompiliert und funktioniert wie erwartet. Seine Ausgabe ist:
%Vor%1
2
Wenn ich nun den int
Parameter der zweiten Bar
Funktion in bool
und foo1.Bar(1, "xx", "xx", 2, 2);
in foo1.Bar(true, "xx", "xx", 2, 2);
ändere, wird die folgende Zeile nicht kompiliert und ich bekomme den Fehler: 'Foo::Bar': 2 overloads have similar conversions
:
Das ganze Programm, das nicht kompiliert:
%Vor%Ich verstehe nicht, warum es im zweiten Fall eine Zweideutigkeit gibt.
BEARBEITEN
Aber wenn Zeiger implizit in bool
konvertiert werden, warum wird dann kompiliert?
Wenn Sie "Test", "xx", 1, 2
gegen const char*, ...
anpassen, hat die Konvertierungssequenz für das erste Argument einen genauen Übereinstimmungsrang, die zweite bis vierte sind Ellipsenumwandlungssequenzen. Also (exakte Übereinstimmung, Auslassungszeichen, Auslassungszeichen, Auslassungszeichen).
Wenn Sie "Test", "xx", 1, 2
gegen bool, const char*, ...
anpassen, hat die erste Konvertierungssequenz für das erste Argument den Konvertierungsrang; Die zweite ist eine exakte Übereinstimmung, die dritte und vierte sind Ellipsenumwandlungssequenzen. Mit anderen Worten, (Konvertierung, exakte Übereinstimmung, Auslassungszeichen, Auslassungszeichen).
Exakte Übereinstimmung schlägt die Umwandlung; Alles schlägt Ellipse (siehe [over.ics.rank] ). Daher haben wir hier eine sogenannte Kreuzungssituation, in der eine Funktion eine bessere Konvertierungssequenz für ein Argument und die andere Funktion eine bessere Konvertierungssequenz für ein anderes Argument aufweist. Da eine notwendige (aber nicht ausreichende) Bedingung für eine Funktion besser als eine andere Funktion ist, ist, dass keine der Umwandlungssequenzen schlechter ist als die der anderen Funktion ([over.match.best]/1 ), keine dieser beiden Funktionen ist besser als die andere.
Das ist in Ordnung:
%Vor%Das ist nicht in Ordnung:
%Vor%Im ersten Fall ist die erste Version von Bar () deutlich besser. Aber im zweiten Fall ist es nicht mehr so klar, denn während die erste Version eine bessere Übereinstimmung mit Parameter 1 hat, ist die zweite Version besser mit Parameter 2 kompatibel.
Die verbleibende Frage ist: Warum vermeidet die Verwendung von "int" anstelle von "bool" die Mehrdeutigkeit? Die Antwort ist, dass ein Zeiger implizit in bool, aber nicht in int konvertieren kann.