Wenn Sie eine Funktion überlasten und sie dann mit einem Argument nennen, die sich perfekt einer der Überlastungen SpieleRegeln für die implizite Konvertierung von Template-Argumente
int f(int){return 3;}
int f(bool){return 4;}
... //inside main()
f(1); //Calls f(int)
der Compiler einfach wählt diese (perfekt) Spiel, bevor Sie implizite Konvertierungen versuchen . Allerdings habe ich versucht, eine Funktion TEMPLATE zu überlasten, wie in
template <bool veracity>
int f(){return 1;}
template <int amount>
int f(){return 2;}
... //inside main()
f<1>();
aber der Compiler auf den überlasteten f() complainning über mehrdeutigen Anruf hält, die besagt, es könnte entweder f<true>()
oder f<1>()
sein. Sollte der Compiler nicht einfach die perfekte Übereinstimmung wählen, anstatt zu versuchen, in wahr zu konvertieren?
Ich hatte den Eindruck, dass die implizite Konvertierung für Template-Argumente tatsächlich restriktiver war als die implizite Konvertierung von Funktionsargumenten. Gibt es eine Möglichkeit, dieses Problem zu umgehen?
ich sehe. Weißt du, ob es einen bestimmten Grund gibt, warum die Regeln so sind? Ich meine, gibt es einige technische Schwierigkeiten oder etwas, was es für Compiler praktisch unmöglich machen würde, die "exact-match-first/implicit-conversion-second" -Logik (die in Funktionsargumenten verwendet wird) auf Template-Argumente anzuwenden? – Malabarba
Nein, ich weiß es nicht genau. Meine Vermutung ist, dass es vor allem daran liegt, dass die Regeln bereits komplex sind und dass das Hinzufügen von Regeln für das "Ranking", wie es beim Überladen der Fall ist, sie sogar noch stärker machen würde. Ich bin mir nicht sicher, aber aufgrund der Interaktion mit den anderen Regeln für Templates würde sich die Rangordnung zumindest ein wenig von der für Überladungen unterscheiden, also wäre das nicht nur eine Frage der Aussage "Die Kandidatenfunktionen bilden eine Überladungsgruppe, die gemäß §13.3 gelöst werden soll." –
Sinn macht.Vielen Dank. =) – Malabarba