Overload resolution



  • Hallo,

    ich verstehe gerade die overload resolution nicht:

    void f(double, int, int){}
    void f(int, double, double){}
    
    void g(int, int, double){}
    void g(int, double, double){}
    
    void h(int, int, double){}
    void h(int, double, int){}
    
    int main()
    {
        f(1,2,3);   // ambiguous
        g(1,2,3);   // g(int, int, double)
        h(1,2,3);   // ambiguous
    }
    

    Meine Frage: Warum ist f ambiguous?
    Wenn es um die Anzahl der perfect-matches geht, dann müsste f(double, int, int) gewinnen. Wenn "von links nach rechts" ausgewertet wird, dann dürfte h nicht ambiguous sein, sondern h(int, int, double) müsste gewinnen.
    Welche Regel sorgt dafür, dass f ambiguous ist?


  • Mod

    Wenn es um die Anzahl der perfect-matches geht, dann müsste f(double, int, int) gewinnen. Wenn "von links nach rechts" ausgewertet wird, dann dürfte h nicht ambiguous sein, sondern h(int, int, double) müsste gewinnen.

    Weder noch. Damit eindeutig aufgeloest werden kann, muss eine Ueberladung fuer jeden Parameter mindestens genauso passend sein wie die andere.



  • Schau mal hier:
    https://en.cppreference.com/w/cpp/language/overload_resolution

    unter "Best viable function:

    F1 is determined to be a better function than F2 if implicit conversions for all arguments of F1 are not worse than the implicit conversions for all arguments of F2, and

    1. there is at least one argument of F1 whose implicit conversion is better than the corresponding implicit conversion for that argument of F2

    Also: keine Konvertierung darf schlechter sein, aber mindestens eine muss besser sein, damit eine Funktion besser als die andere ist.



  • Guten morgen...! Das war ja doch recht einfach!

    Danke schön!


Anmelden zum Antworten