In einem Stück Code finde ich etwas wie:
%Vor%Die Frage ist, wo kann ich eine Beschreibung finden, warum die Verwendung von "int C :: *" in der Funktion test () Definition gültig ist?
Ich werde nicht beschreiben, was int C::*
bedeutet, da @Charles Bailey das schon sehr gut gemacht hat. Ich werde jedoch Ihre Frage beantworten:
(...) warum die Verwendung von "int C :: *" im Funktionstest () gültig ist Definition?
Der entscheidende Punkt ist, dass die Verwendung von int C::*
(Zeiger auf Element vom Typ int
) genau dann gültig ist, wenn C
ein Klassentyp ist. Sonst ist der Typ int C::*
schlecht gebildet.
Deshalb haben Sie
%Vor%und höchstwahrscheinlich irgendwo unter
%Vor% Wenn test<T>(0)
vom Compiler gesehen wird, untersucht es die Kandidaten für test
. Es findet zwei:
Der erste hat Vorrang vor dem zweiten, weil 1) beide Vorlagenfunktionen sind und 2) die Ellipse zuletzt nachgeschlagen wird. Wenn der erste schlecht formatiert ist (dh genau dann, wenn C
kein Klassentyp ist), wird er einfach verworfen und die zweite Überladung wird genommen. Dieses Verhalten hat den Spitznamen SFINAE (Substitutionsfehler ist kein Fehler).
Testen Sie die Größe des Rückgabetyps (denken Sie daran, dass sizeof(char)
immer 1 ist), Sie können zur Kompilierzeit feststellen, welche test
verwendet wird, d. ob T
ein Klassentyp ist oder nicht.
int C::*
ist ein Zeiger auf ein Mitglied von C
vom Typ int
. Suchen Sie nach "Zeiger zu Mitglied". Der Abschnitt des Standards (ISO / IEC 14882: 2003), der sich mit dieser Deklarationssyntax befasst, ist 8.3.3 Pointer to members [dcl.mptr].
Beispielverwendung.
%Vor%