Überladen, variadische Funktionen und bool type

8

Das folgende Programm kompiliert und funktioniert wie erwartet. Seine Ausgabe ist:

  

1
  2

%Vor%

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 :

%Vor%

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?

%Vor%     
Michael Walz 04.10.2016, 15:21
quelle

2 Antworten

5

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.

    
T.C. 04.10.2016, 22:31
quelle
5

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.

    
Donghui Zhang 04.10.2016 15:48
quelle

Tags und Links