Okay, ich wurde inspiriert, ein bisschen auf den Kopf zu schlagen . Überlastung scheint operator&zu nicht geringen Schmerzen zu führen.
Welche legitimen Fälle gibt es für eine Überlastung?
(Ich kann nicht sagen, dass ich das jemals getan habe ...)
Okay, ich wurde inspiriert, ein bisschen auf den Kopf zu schlagen . Überlastung scheint operator&zu nicht geringen Schmerzen zu führen.
Welche legitimen Fälle gibt es für eine Überlastung?
(Ich kann nicht sagen, dass ich das jemals getan habe ...)
Antworten:
Ich erinnere mich an so etwas wie eine Smart-Pointer-Klasse, die überschrieben wurde, operator&weil sie die Adresse des enthaltenen Zeigers und nicht die Adresse des Smart-Pointer-Objekts zurückgeben wollte. Ich kann mich nicht erinnern, wo ich es gesehen habe oder ob es damals eine gute Idee war.
Aha, erinnert sich: Microsoft CComPtr .
Edit: Zur Verallgemeinerung, es könnte Sinn unter den folgenden Bedingungen:
Die Rückgabe eines anderen als eines legitimen Zeigers würde gegen das Prinzip des geringsten Erstaunens verstoßen .
T *. Der von zurückgegebene Zeiger operator&hat den Typ T **und zeigt auf den enthaltenen Zeiger.
Dies ist nützlich, wenn die &Operation in Lambda-Platzhalternotation dargestellt wird, z &_1[_2].
Wenn Sie unary &überladen , verhält sich Ihr Objekt (in dieser Hinsicht) wie eine Referenz .
Ich bin mir ziemlich sicher, dass es ein Kinderspiel ist, Alternativen zu integrierten Referenzen bereitzustellen, insbesondere da Referenzen in C ++ überhaupt keine Objekte sind und keine eigenen Adressen haben. Instanzen Ihres benutzerdefinierten Typs sind unweigerlich Objekte und haben Adressen, selbst wenn Sie die normale Methode zum Abrufen dieser Adresse deaktivieren. Es ist also niemals eine perfekte Nachahmung.
Aber die Leute sind sehr an benutzerdefinierten Alternativen zu Zeigern interessiert, sodass ich sehen kann, wie jemand es versuchen möchte. Ich bin nicht sicher, ob sie es vermeiden werden, einen Typ zu erstellen, der sich (falsch) so verhält, dass seine Benutzer wünschen, sie hätten sich nicht darum gekümmert.
Ich habe dies im Kontext eines DSL, das LLVM-Code generiert, erfolgreich durchgeführt. Ein Beispiel wird veranschaulichen. Sagen Sie xund ysind Werte (dh Objekte vom Typ value). Dann gibt der Ausdruck x+yeine ADD-Anweisung in einen Codestream aus. Sehr vernünftig gibt der Ausdruck &xeine Anweisung aus, die Adresse von zu übernehmen x.
Vier Jahre später eine andere Antwort.
Eine andere Verwendung, die ich gesehen habe, ist, wenn Sie die C ++ - Sprache huckepack nehmen, aber Ihre eigene Semantik definieren. Paradebeispiel: Boost.Spirit.
Boost.Spirit, insbesondere Qi zum Parsen, überlädt Operatoren auf Parsern, um eine EBNF-ähnliche Syntax zum Angeben beliebiger Parserobjekte bereitzustellen. Insbesondere ist der unäre &Operator überlastet, um den And-Predicate-Parser bereitzustellen .
And-Predicate Parser (& a)
Beschreibung
Syntaktische Prädikate bestätigen, dass eine bestimmte bedingte Syntax erfüllt sein muss, bevor eine andere Produktion bewertet wird. Ähnlich wie semantische Prädikate, eps, verbrauchen syntaktische Prädikate keine Eingabe. Das and-Prädikat & a ist ein positives syntaktisches Prädikat, das nur dann eine Übereinstimmung mit der Länge Null zurückgibt, wenn sein Prädikat übereinstimmt.
Anwendungsbeispiel:
Grundlegendes Beispiel für die Vorausschau: Stellen Sie sicher, dass das letzte Zeichen ein Semikolon ist, aber verbrauchen Sie es nicht. Schauen Sie sich nur das nächste Zeichen an:
test_phrase_parser("Hello ;", lit("Hello") >> &lit(';'), false);
Kurz gesagt, das Unäre hat &hier überhaupt keine Beziehung zu Zeigern; Es verfügt über eine domänenspezifische Semantik, die für Qi-Parser-Objekte gilt.
Früher habe ich den Operator & (ohne sein Verhalten zu ändern) als privat für die Klasse überschrieben, um mich vor der gelegentlichen Erstellung eines intelligenten Zeigers auf das im Stapel erstellte Objekt zu schützen. Ich bin mir immer noch nicht sicher, ob es wirklich eine gute Idee war ...
Sie können den Adressoperator überladen, um ihn privat zu machen. Dies kann nützlich sein, um eine Art Staffelübergabeschema zu implementieren, bei dem die Adresse des Staffelstabs nicht übernommen werden kann. Wenn die Konstrukteure des Schlagstocks versteckt sind, kann dies das Zielfernrohr des Schlagstocks luftdicht halten.
std::addressofvorhanden ist, kann die Adresse weiterhin übernommen werden. stackoverflow.com/questions/6494591/…