Wieso können Vergleichoperatoren nicht static sein



  • Hallo

    Wieso verbietet mir mein Compiler folgende Zeile zu schreiben (als Memberfunktion)?

    bool static operator== (const footype &cmp01, const footype &cpm2) const throw();
    

    MfG, EOutOfResources



  • Hi

    Es ist IMAO nicht wirklich sinvoll diese Operatoren statisch zu machen, da sie auf Instanzen der Klasse angewendet werden.

    Wenn du sowas machst:

    Class a, b;
    if ( a == b )
    //...
    

    dann wird über das Objekt a die Methode operator== in etwa so aufgerufen:
    a.operator==(b)

    Gegenfrage: Wieso willst das überhaupt static machen?



  • Gegenfrage: Warum willst du das tun?

    Der einzige Sinn von Operatorüberladung ist doch, dass du ne angenehmere Syntax verwenden kannst. Das kannst du aber nicht, wenn der Operator static ist.



  • EOutOfResources schrieb:

    Wieso verbietet mir mein Compiler folgende Zeile zu schreiben (als Memberfunktion)?

    Gegenfrage: Was sollte das bringen? Wie sollte der Operator als statische Funktion angesprochen werden?

    Zudem: Sei vorsichtig bei der Verwendung von Exceptionzusicherungen, besser noch, lass sie ganz weg (oder nur als Kommentar).



  • asc schrieb:

    Wie sollte der Operator als statische Funktion angesprochen werden?

    Wird er nicht implizit aufgerufen, wenn man vergleichen möchte und der Standard-Vergleichsoperator nicht verfügbar ist?



  • In C# z.B. werden die Operatoren als statische Methoden implementiert. Das Pendant in C++ sind freie Funktionen, die es in C# nicht gibt. Möglicherweise ist das gemeint.



  • asc schrieb:

    Gegenfrage: Was sollte das bringen? Wie sollte der Operator als statische Funktion angesprochen werden?

    Du könntest binäre Operatoren definieren, welche auf Member einer Klasse zugreifen könnten, ohne dass der Operator friend ist, oder das getter bereitgestellt werden.



  • Tachyon schrieb:

    asc schrieb:

    Gegenfrage: Was sollte das bringen? Wie sollte der Operator als statische Funktion angesprochen werden?

    Du könntest binäre Operatoren definieren, welche auf Member einer Klasse zugreifen könnten, ohne dass der Operator friend ist, oder das getter bereitgestellt werden.

    Wie rufst du den Operator dann auf? Was unterscheidet ihn dann noch von einer "normalen" Funktion?



  • Michael E. schrieb:

    Tachyon schrieb:

    asc schrieb:

    Gegenfrage: Was sollte das bringen? Wie sollte der Operator als statische Funktion angesprochen werden?

    Du könntest binäre Operatoren definieren, welche auf Member einer Klasse zugreifen könnten, ohne dass der Operator friend ist, oder das getter bereitgestellt werden.

    Wie rufst du den Operator dann auf? Was unterscheidet ihn dann noch von einer "normalen" Funktion?

    Genauso, wie Du global definierte Operatoren aufrufst. Der Unterschied ist der erlaubte Zugriff auf private Daten.



  • Einer von uns beiden steht mächtig auf dem Schlauch...

    Der OP will nen Operator als statischen Member einer Klasse deklarieren. Dann müsstest du den Operator explizit aufrufen, wenn die Deklaration erlaubt wäre.



  • Tachyon schrieb:

    Michael E. schrieb:

    Tachyon schrieb:

    asc schrieb:

    Gegenfrage: Was sollte das bringen? Wie sollte der Operator als statische Funktion angesprochen werden?

    Du könntest binäre Operatoren definieren, welche auf Member einer Klasse zugreifen könnten, ohne dass der Operator friend ist, oder das getter bereitgestellt werden.

    Wie rufst du den Operator dann auf? Was unterscheidet ihn dann noch von einer "normalen" Funktion?

    Genauso, wie Du global definierte Operatoren aufrufst. Der Unterschied ist der erlaubte Zugriff auf private Daten.

    Das würde aber dem Sinn vom statischen Methoden ein bisschen zuwider laufen. Auch in C# emfinde ich das nur als Hilfskonstrukt, damit man ja keine freien Funktionen rein nimmt. Diese sind in C++ aber da und eignen sich wesentlich besser. Zur Not macht man sie eben zum friend. Und: friends kann man auch in der Klasse definieren.



  • Standard wäre den Operator als freie Funktion zu definieren (mit oder ohne friend ).



  • Michael E. schrieb:

    Einer von uns beiden steht mächtig auf dem Schlauch...

    Der OP will nen Operator als statischen Member einer Klasse deklarieren. Dann müsstest du den Operator explizit aufrufen, wenn die Deklaration erlaubt wäre.

    Die Frage des OP war: "Wieso geht es nicht"

    Meine Antwort bezog sich auf die Frage: Was würde es bringen, wenn es gehen würde. Wenn es gehen würde (was es nicht tut), dann müsste man ja auch die Operatoren nicht explizit aufrufen, weil auch das ADL korrekt laufen würde.



  • Würde es nicht:

    struct Foo
    {
    	static void bar(const Foo& lhs, const Foo& rhs) {}
    };
    
    int main()
    {
    	Foo f1, f2;
    	bar(f1, f2);    // Fehler: Was ist bar?
    }
    


  • Tachyon schrieb:

    [...]Wenn es gehen würde (was es nicht tut)[...]

    Ich habe das "würde" bezüglich des ADL sogar extra kursiv geschreiben. Vielleicht noch fett und unterstrichen?



  • Um noch konkreter zu werden: Wenn es (das Deklarieren eines static Member-Operators) gehen würde, warum sollte dann ADL greifen? Die Argumente des Operators liegen im globalen Namespace. Warum soll dann innerhalb von Foo nach dem Operator gesucht werden?



  • Michael E. schrieb:

    Um noch konkreter zu werden: Wenn es (das Deklarieren eines static Member-Operators) gehen würde, warum sollte dann ADL greifen? Die Argumente des Operators liegen im globalen Namespace. Warum soll dann innerhalb von Foo nach dem Operator gesucht werden?

    Weil es ziemlich blödsinnig wäre, Operatoren als statische Member einzuführen, ohne für das ADL eine Invariante für die Behandlung eben jener Operatoren zu berücksichtigen.



  • Tachyon schrieb:

    Michael E. schrieb:

    Um noch konkreter zu werden: Wenn es (das Deklarieren eines static Member-Operators) gehen würde, warum sollte dann ADL greifen? Die Argumente des Operators liegen im globalen Namespace. Warum soll dann innerhalb von Foo nach dem Operator gesucht werden?

    Weil es ziemlich blödsinnig wäre, Operatoren als statische Member einzuführen, ohne für das ADL eine Invariante für die Behandlung eben jener Operatoren zu berücksichtigen.

    Also ist deine Argumentation: Wenn man alle relevanten Stellen des Standards so abändern würde, dass es funktioniert und "Sinn ergibt", dann würde es funktionieren und Sinn ergeben 🕶 Es war nämlich nie davon die Rede, dem ADL einen Spezialfall hinzuzufügen.


  • Mod

    Ist sowieso nicht erkennbar, welchen Vorteil eine Definition als statische Member gegenüber nichtstatischen Member haben könnte. Selbst wenn man unterstellt, dass ADL entsprechend angepasst wird, könnte die Deklaration nicht gefunden werden, wenn für alle Parameter Konvertierungen erforderlich wären.


Anmelden zum Antworten