Aus welchem Grund können Zeiger auf Elementfunktionen nicht auf konstante Elementfunktionen zeigen?
%Vor%Später im Code:
%Vor%Dieser Code erzeugt:
%Vor% Natürlich kompiliert es mit &A::g
anstelle von &A::f
.
In entgegengesetzter Situation:
%Vor%Der Fehler ist:
%Vor% Der zweite Fall ist ziemlich klar. Es wird nicht erwartet, dass const
pointer das Objekt ändert, so dass es die Funktion, die es ausführt, nicht halten kann. Aber warum ist es nicht möglich, const
member Funktion wie im ersten Fall non-const
member Funktion zuzuordnen?
Es sieht nach der Regel für normale Zeiger aus, bei denen das Umwandeln des Werts durch das Umwandeln von const
in non-const
erlaubt wäre, aber ich sehe den Punkt nicht, in dem die const-Korrektheit in der Funktionsdefinition vor einer solchen Zuweisung überprüft wird .
Nicht statische Elementfunktionen haben einen zusätzlichen versteckten this
-Parameter. Angesichts der Existenz dieses zusätzlichen versteckten Parameters verhält sich ein nicht-statisches void A::f() const;
ähnlich wie void A__f(const A *__this)
, und das Verhalten, das Sie für Member-Funktionen sehen, modelliert das Verhalten für Nicht-Member-Funktionen.
Ob es bei einer Implementierung brechen könnte, theoretisch kann eine Implementierung einen void *
-Parameter aus einem anderen Register lesen als einen const void *
-Parameter, und wenn ja, das Ergebnis der Konvertierung ( Wäre es gültig), könnte nicht verwendet werden, um f
richtig aufzurufen. Ich habe keine Ahnung, warum ein Hersteller eine solche Entscheidung treffen würde, und ich kenne keine wirkliche Implementierung, die dies tut, aber es ist eine, die vom Standard zugelassen wird.
Aus welchem Grund können Zeiger auf Elementfunktionen nicht auf konstante Elementfunktionen zeigen?
Weil der const
-Modifikator Teil der Funktionssignatur ist. Sobald Sie einen Funktionszeiger deklariert haben, kann dieser Funktionszeiger nur verwendet werden, um Funktionszeiger mit derselben Funktionssignatur zuzuweisen.
Tags und Links const c++ pointers function-pointers