Frage

, wenn die folgenden aus dem C ++ FAQ Lite ist wahr: „ein Funktionsname Zerfälle auf einen Zeiger auf die Funktion“ (als ein Array Name Zerfälle auf einen Zeiger auf das erste Element); warum müssen wir das & -Zeichen enthalten?

typedef  int (Fred::*FredMemFn)(char x, float y);
FredMemFn p = &Fred::f;

Und nicht nur:

typedef  int (Fred::*FredMemFn)(char x, float y);
FredMemFn p = Fred::f;

Im zweiten Fall Fred :: f eine Funktion ist, und kann auf diese Funktion auf einen Zeiger zerfallen.

Ich hoffe, diese Frage ist nicht so dumm.

War es hilfreich?

Lösung

Original Antwort:

weil ein Mitglied-Funktion ist keine Funktion und Mitglied-Funktion-Zeiger ist kein funktions Zeiger. Daher sind die Regeln des Verfalls nicht gelten.

Außerdem gibt es Funktionstyp in C ++, aber nicht Mitglied-Funktion-Typ. So können Sie eine Funktion an Orten, wo ein Zeiger-to-Funktion zu erwarten ist, aber man kann nicht Mitglied-Funktion verwenden, da es nicht so etwas ist, nur Zeiger-to-Mitglied-Funktion. f in Ihrem Beispiel ist eine Funktion. Auf der anderen Seite, Fred :: f ... na ja, nichts.

Außerdem würde ich argumentieren, dass „der Name einer Funktion abklingen kann ...“. Nein, der Name kann nichts tun, einen L-Wert von Funktionstyp kann implizit in einen Zeiger-to-Funktion umgewandelt werden, und dies ist eine Identitätsumwandlung bis Überladungsauflösung betrifft

Bearbeiten von meiner Antwort zu klären:

Jeder Ausdruck in C ++ hat einen Typ und Wert. Ein Wert eines Typs kann gelegentlich auf einen Wert eines anderen Typs konvertiert werden. Diese Umwandlungen werden, so dass Platz zu einer Umwandlung besser zu machen, dass ein anderer hauptsächlich für die Funktion der Überladungsauflösung.

Einer der Typen der Konvertierungen wird lvalue-to-rvalue Umwandlung genannt. Wenn ein L-Wert in einem Kontext erscheint, in dem ein R-Wert diese Umwandlung erforderlich ist, erfolgt. Normalerweise wird diese Art der Umwandlung tut nichts, zum Beispiel:

int i = 4, j = 5;
i = j;

In der zweiten Zeile j ist ein L-Wert, aber ein R-Wert ist hier erforderlich, so j zu einem R-Wert umgewandelt wird. Aber dies ist nicht eine beobachtbare Umwandlung, oder? Aber es gibt Fälle, in denen die L-Wert-to-rvalue Umwandlung beobachtet werden kann. Das heißt, ein L-Wert von Array von n T kann mit einem R-Wert vom Typ T* dessen Wert umgewandelt wird, ist die Adresse des ersten Elements des Arrays und < em> ein L-Wert vom Typ „Funktion mit Unterschrift S“ rvalue vom Typ „Zeiger auf Funktion mit Unterschrift S“, dessen Wert die Adresse der Funktion

Das bedeutet, dass, wenn wir eine Funktion auf einen Zeiger-to-Funktion die Funktion L-Wert zuweisen implizit es der Adresse umgewandelt wird.

void f() {}
void (*p) () = f; //f is converted to rvalue

f ist ein Ausdruck und hat einen Typ. f der Typ ist void()

Es gibt keine solche Art in C ++ als member-function Es gibt Zeiger-to-Mitglied-Funktionen, aber nicht Mitglied Funktionen selbst. Ich spreche natürlich über nicht-statische Funktionen. Statische Funktionen funktionieren auf die gleiche Art und Weise wie gewöhnliche Funktionen, das heißt, Sie müssen nicht zu schreiben &X::f, stattdessen können Sie schreiben X::f Warum? Da X :: f hat eine Typ-Funktion und die oben erwähnte Umwandlung erfolgt. Wenn f nicht statische ist jedoch X :: f vom Typ ist ... was? Oh ja, es hat keinen Typ und daher ist kein Ausdruck und daher keinen Wert haben und deshalb dieser Wert kann nicht auf etwas umgewandelt werden.

Zitat von der Norm: 5.3.1 Satz 3 Ein Zeiger auf das Element wird nur gebildet, wenn eine explizite & verwendet wird und seine Operanden ist ein qualifizierter-ID nicht in Klammern eingeschlossen. [Anmerkung: Das heißt, der Ausdruck (qualifizierte-ID), in dem die qualifizierten Nummer in Klammern eingeschlossen ist, nicht einen Ausdruck des Typs „Zeiger auf Member“. Bildet Auch nicht qualifiziert-ID, weil es keine implizite Konvertierung von einer qualifizierten-ID für eine nicht statische Memberfunktion auf den Typ „Zeiger auf Elementfunktion“, wie es von einem L-Wert von Funktionstyp der Art „Zeiger auf Funktion“ (4.3) ist. Auch ist & unqualifizierte-ID ein Zeiger auf Element, auch innerhalb des Umfangs der unqualifizierte-id Klasse. ]

Hope war klarer ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top