== impliziert !=



  • Hi,

    wenn ich für zwei Pointer operator== implementiere um auf Gleichheit der Objekte dahinter zu prüfen, ist dann automatisch auch != so definiert oder ist
    (A == 😎 dann nicht äquivalent zu !(A != 😎

    danke


  • Mod

    _et schrieb:

    wenn ich für zwei Pointer operator== implementiere

    Das ist dann kein C++. Operatoren können nur überladen werden, wenn wenigstens ein Operand ein UDT ist.



  • Genau. Weiters kannst und musst du operator == und != einzeln/extra/getrennt überladen/definieren wenn du beide verwenden willst. D.h. wenn du nur == definierst dann gibt es auch nur ==.
    Operator != wird dann meist einfach so implementiert:

    bool operator == (UDT const& a, UDT const& b)
    {
        // ...
        // ...
        // ...
    }
    bool operator != (UDT const& a, UDT const& b)
    {
        return !(a == b);
    }
    

    Und wenn du Operatoren für 2 unterschiedliche Typen definierst musst du auch beide Richtungen definieren:

    bool operator == (UDT_A const& a, UDT_B const& b)
    {
        // ...
    }
    
    bool x1 = UDT_A() == UDT_B(); // geht
    bool x2 = UDT_B() == UDT_A(); // geht NICHT
    
    bool operator == (UDT_B const& b, UDT_A const& a)
    {
        return a == b;
    }
    
    bool x3 = UDT_B() == UDT_A(); // jetzt schon :)
    


  • Es reicht aber tatsächlich == und < zu implementieren und dann die Header-Datei <utility> einzubinden.

    MfG SideWinder



  • ... und den Namensraum std::rel_ops (oder so ähnlich) einzubinden 😉


  • Mod

    ... wenn die beiden Argumente vom gleichen Typ sind und die überladenen Operatoren < und == per ADL hefunden werden können, das für die anderen Operatoren aber nicht notwendig ist. Gerade Letzteres macht diesen Teil der Standardbibliothek in meinen Augen weniger nützlich.


Anmelden zum Antworten