ambiguous overload



  • Doofe Frage aber wieso kompiliert das nicht?

    #include <cstdlib>
    #include <cmath>
    
    void abs(unsigned){}
    
    int main()
    {
        using std::abs;
        abs(unsigned{});
    }
    

    Link: http://coliru.stacked-crooked.com/a/5631c7fabb023a6b

    Wenn ich dann noch ein using hinmache, dann klappt es plötzlich:

    #include <cstdlib>
    #include <cmath>
    
    void abs(unsigned){}
    
    int main()
    {
        using ::abs;
        using std::abs;
        abs(unsigned{});
    }
    

    Werden mit using importierte Funktionen den normal sichtbaren bevorzugt bzgl. overload resolution? Wieso fällt der Aufruf nicht auf die globale abs-Funktion zurück, wenn die resolution in std fehlschlägt?


  • Mod

    leeres herz schrieb:

    Wieso fällt der Aufruf nicht auf die globale abs-Funktion zurück, wenn die resolution in std fehlschlägt?

    Der Compiler sucht ja nicht mal in std. Eine using Deklaration ist eine Deklaration. Die betreffenden Entitäten werden direkt in die deklarative Region (Scope ist der Körper der Funktion) eingefügt, in der die using Deklaration steht. Deklarationen in einem inneren Scope verdecken Deklarationen gleichen Namens in äußeren Scopes.
    ADL hilft auch nicht aus Klemme, weil kein UDT im Spiel ist - unsigned hat keinen assoziierten Namensraum.


  • Mod

    Wieso fällt der Aufruf nicht auf die globale abs-Funktion zurück, wenn die resolution in std fehlschlägt?

    Name lookup geschieht strikt vor overload resolution. Es gibt dort keine Rückkopplung.


Anmelden zum Antworten