Sie vereinfachen die Struktur der C++ - Deklaration zu stark (auch wenn die von Ihnen getroffenen Punkte vollkommen logisch sind). Nur auf den ersten Blick könnte es scheinen, dass C++ - Deklaration aus Typnamen und einer Folge von durch Komma getrennten Entitätsnamen besteht, aber in Wirklichkeit in C++ (wie auch in C) besteht die Deklaration tatsächlich aus Typenname und Folge von Deklaratoren. Die vollständigen Typinformationen für eine Entität, die Sie deklarieren, werden zwischen zwei separaten Standorten aufgeteilt, und ein Teil davon ist tatsächlich ein Teil des Deklarators. Es ist genau so, wie es in C++ ist. Um die tatsächliche Struktur der Erklärung besser widerspiegeln (wie sie in der Sprache zu sehen ist), könnte es eine gute Idee, Format Erklärungen als
int *a, *b;
dh explizit Gruppe *
s mit dem Entity-Namen, nicht mit dem Typ Name. (Aber am Ende ist es eine Frage der persönlichen Präferenz.)
Warum es so in der Sprache entworfen ist, wie Sie in einem der Kommentare fragen ... Wie Sie wissen, die Teile der Deklarationssyntax, die die Art der Entität beschreiben kann auf der linken Seite des Namens (wie *
und &
) sowie auf seiner rechten Seite (wie ()
und []
), wie in
int *f(), (&g)[5], h[2][2];
erscheinen erklärt wird
Für die Bits, die auf der rechten Seite erscheinen, ist es einfach unmöglich, es auf andere Weise zu tun. Sie haben keine andere Wahl, als mit dem Entitätsnamen und nicht mit dem Typnamen gruppiert zu werden. Man könnte weiter fragen, warum die oben genannten Erklärungen nicht in C++ durchgeführt werden als
int *() f;
int (&)[5] g;
int [2][2] h;
(dh alles typbezogene erscheint auf der linken Seite in einer kompakten Gruppe) ... Nun, die Antwort auf diese Frage ist nur so ist es in C++. Der Ansatz wird von C geerbt, und dort wird oft die "Erklärung muss der Verwendung ähnlich sein" als Begründung angeführt.
P.S. Eine andere Sache zu erinnern (und was oft falsch interpretiert wird) ist, dass Qualifikationsmerkmale neben dem Typnamen in der Deklaration Teil des gemeinsamen Typ sind, nicht ein Teil des ersten einzelnen Deklarators.Zum Beispiel
int const *a, *b;
erklärt const int *a
und const int *b
, nicht int *b
wie manche glauben Irrigerweise. Aus diesem Grund ziehe ich persönlich die logischere
const int *a, *b;
Ordnung (obwohl ich mit dem Namen *
lieber Gruppe zugleich auch, nicht mit dem Typ) zu verwenden.
möglich duplicate of http://stackoverflow.com/questions/377164/whats-your-preferred-pointer-declaration-style-and-why –
[Stroustrups Antwort] (http://www.stroustrup.com/bs_faq2 .html # whitespace) für dieselbe Frage. – legends2k