Wo darf in einer Erklärung ein Speicherklassenbezeichner stehen?

Betrachten wir zum Beispiel dasstatic Speicherklassenbezeichner. Hier sind einige Beispiele für gültige und unsachgemäße Verwendungen dieses Speicherklassenspezifizierers:

static int a;        // valid
int static b;        // valid

static int* c;       // valid
int static* d;       // valid
int* static e;       // ill-formed

static int const* f; // valid
int static const* g; // valid
int const static* h; // valid
int const* static i; // ill-formed

typedef int* pointer;
static pointer j;    // valid
pointer static k;    // valid

(Die als "gültig" gekennzeichneten Deklarationen wurden von Visual C ++ 2012, g ++ 4.7.2 und Clang ++ 3.1 akzeptiert. Die als "falsch" gekennzeichneten Deklarationen wurden von all diesen Compilern abgelehnt.)

Dies erscheint merkwürdig, da der Speicherklassenspezifizierer auf die deklarierte Variable angewendet wird. Dies ist die deklarierte Variablestatic, nicht der Typ der deklarierten Variablen. Warum sinde undi schlecht geformt, aberk ist wohlgeformt?

Welche Regeln gelten für die gültige Platzierung von Speicherklassenspezifizierern? Während ich benutzt habestatic In diesem Beispiel gilt die Frage für alle Speicherklassenbezeichner. Eine vollständige Antwort sollte vorzugsweise relevante Abschnitte des C ++ 11-Sprachstandards zitieren und erläutern.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage