Bevorzugt der Compiler Instantiierung oder implizite Konvertierung?



  • Hallo zusammen,

    nehmen wir an, ich habe eine Funktion und ein Funtionstemplate in der Art;

    void foo(TypeA X);
    
    template <typename T>
    void foo(T X);
    

    Jetzt rufe ich foo auf mit einem Variable eines Types welcher implizit in TypeA konvertierbar ist. Was passiert dann? Wird die Funktion aufgerufen, oder das Template für den exakten Typ instantiiert?


  • Mod

    Nein, letztere wird aufgerufen.

    Bei Overload Resolution wird eine Menge an sog. viable functions erstellt. Zu dieser gehört auch die Spezialisierung des Funktionstemplates (mit entsprechenden deduzierten Argumenten). Nun wäre, wenn du foo(TypeA()) schreibst, die non-template Funktion besser:

    Given these definitions, a viable function F1 is defined to be a better function than another viable function F2 if for all arguments i, ICSi( F1 ) is not a worse conversion sequence than ICSi( F2 ), and then
    — for some argument j, ICSj( F1 ) is a better conversion sequence than ICSj( F2 ), or, if not that,
    [...]
    F1 is a non-template function and F2 is a function template specialization, or, if not that,

    Wie du siehst trifft aber bei deinem Beispiel der erste Punkt zuerst zu, daher wird bei deinem Fall das Funktionstemplate aufgerufen.


Anmelden zum Antworten