Warum Zeiger auf nicht-const-Member-Funktion kann const Member-Funktion und Gegenteil zeigen nicht?

8

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 .

    
pkubik 19.01.2014, 20:31
quelle

2 Antworten

3

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.

%Vor%

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.

    
hvd 19.01.2014, 20:47
quelle
4
  

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.

    
Shoe 19.01.2014 20:36
quelle