Aufruf mehrdeutig oder nicht?



  • Folgendes:

    struct Foo {
       operator int ()
       { ... }
       int operator += (int x)
       { ... }
    };
    
    ...
    {
    Foo bar;
    int quer = 22;
    
    bar += quer ;  // hierum geht's
    }
    

    Ist der Aufruf mehrdeutig? Ich hab sowas ähnliches gehabt (dieses Minimalbeispiel ist ungetestet), bei dem einige Compiler den selbstgeschriebenen operator += verwendet haben und einige meinten es sei mehrdeutig. Wer hat recht?



  • Hallo,

    was sollte mehrdeutig sein?

    Hier sollte der selbstgeschriebene Operator aufgerufen werden.

    mfg
    v R



  • Hallo,
    ich schätze mal, dein Minimalbeispiel gibt dein Problem nicht richtig wieder. Das hier ist auf jeden Fall nicht mehrdeutig, da der op+= nicht nur ein "perfect match" ist sondern auch die einzig aufrufbare Funktion.
    Schließlich kann der Konvertierungsoperatoren hier nicht aufgerufen werden, da das Argument auf der linken Seite einer Zuweisung steht.

    War in deinem Beispiel vielleicht eher Operator+ oder ein Operator[] im Spiel?
    Sowas ist z.B. problematisch:

    class String
    {
    public:
    char& operator[](size_t);
    operator const char*();
    };
    int main()
    {
    String s;
    s[4] = 'c';
    }
    

    Dieser Aufruf ist potentiell mehrdeutig. Nämlich genau dann, wenn ptrdiff_t ein int ist.
    Der op[] der Klasse braucht für den Parameter eine Standardkonvertierung
    (int -> unsigned irgendwas).
    Alternativ kann der Compiler eine Benutzerdefinierte-Konvertierung (operator const char*) durchführen und dann den built-in op[](ptrdiff_t) verwenden.

    Zwar ist eine Benutzerdefinierte-Konvertierung schlechter als eine Standardkonvertierung, dafür ist das Argument dann aber ein "perfect match".
    Das heißt du hast:
    perfect match + Standardkonvertierung
    Benutzer-Definierte Konvertierung + perfect Match.
    Keine der beiden Sequenzen ist eindeutig besser als die andere -> Mehrdeutig.


Anmelden zum Antworten