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:
- Sie haben ein Objekt, das sich als ein anderes Objekt tarnt.
- Dieses Objekt kann einen Zeiger auf das Objekt erhalten, als das es sich tarnt.
Die Rückgabe eines anderen als eines legitimen Zeigers würde gegen das Prinzip des geringsten Erstaunens verstoßen .
T *
. Der von zurückgegebene Zeigeroperator&
hat den TypT **
und zeigt auf den enthaltenen Zeiger.Dies ist nützlich, wenn die
&
Operation in Lambda-Platzhalternotation dargestellt wird, z&_1[_2]
.quelle
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.
quelle
Ich habe dies im Kontext eines DSL, das LLVM-Code generiert, erfolgreich durchgeführt. Ein Beispiel wird veranschaulichen. Sagen Sie
x
undy
sind Werte (dh Objekte vom Typvalue
). Dann gibt der Ausdruckx+y
eine ADD-Anweisung in einen Codestream aus. Sehr vernünftig gibt der Ausdruck&x
eine Anweisung aus, die Adresse von zu übernehmenx
.quelle
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 .Anwendungsbeispiel:
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.quelle
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 ...
quelle
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.
quelle
std::addressof
vorhanden ist, kann die Adresse weiterhin übernommen werden. stackoverflow.com/questions/6494591/…