Anscheinend funktioniert ->*
nicht automatisch, wenn Sie ->
überladen, und muss manuell überladen werden.
Warum Iteratoren für Standardcontainer ->*
nicht zusätzlich zu ->
überladen, erzwingen die Verwendung von (*iter).*mem_ptr
anstelle von iter->*mem_ptr
?
Mit dem Vorbehalt, dass diese Fragen normalerweise nicht zu beantworten sind, hier ein paar Gründe, warum operator->*()
möglicherweise nicht überlastet ist. Obwohl es möglich ist, ist die wirkliche Antwort, dass niemand daran gedacht hat. Und wenn dies für Sie eine wichtige Funktion für fehlende Sprachen ist, können Sie ein Angebot einreichen .
Für Anfänger ist ptr->*pmd
im Allgemeinen kein sehr gebräuchlicher Ausdruck. Die Tatsache, dass du it->*pmd
nicht schreiben kannst, ist etwas, was die meisten Leute nicht vermissen, besonders wenn (*it).*pmd
genau dasselbe Ziel erreicht, allerdings auf Kosten von nur 2 zusätzlichen Charakteren. Das potenzielle Aufwärtspotenzial scheint hier eher gering zu sein. Dennoch sollten Iteratoren konsistent mit Zeigern sein, also würde es Sinn machen. Aber ...
Zeiger auf Member sind nicht nur Zeiger auf Member-Daten, wir können auch Zeiger auf Member-Funktionen haben und können (ptr->*pmf)()
today schreiben, wobei ptr->*pmf
für sich schlecht formatiert ist. Sie können diese Semantik überhaupt nicht mit operator->*
erhalten - um die Aufrufoperation zum Laufen zu bringen, müsste ptr->*pmf
im Grunde ein Lambda zurückgeben. So, jetzt, das wird tatsächlich ziemlich kompliziert - es sei denn, Sie möchten ptr->*pmd
nur unterstützen. Bei jedem Ansatz sind Sie mit Zeigern nicht einverstanden.
Bei Eingabe-Iteratoren möchten Sie operator->*()
überhaupt nicht unterstützen, da dies zu einer sofortigen Referenzierung führen würde.
Für mich persönlich sind die Kosten (herauszufinden, wie man diese Operatoren spezifiziert, für welche Iteratoren und was man mit Zeigern zu Elementfunktionen tun soll) nicht wirklich sinnvoll (2 Zeichen in einem Ausdruck, der selten ist) geschrieben).
Tags und Links c++ language-lawyer operator-overloading iterator