¿Dónde en una declaración se puede colocar un especificador de clase de almacenamiento?

Por ejemplo, consideremos lastatic Especificador de clase de almacenamiento. Aquí hay algunos ejemplos de usos válidos y mal formados de este especificador de clase de almacenamiento:

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

(Las declaraciones marcadas como "válidas" fueron aceptadas por Visual C ++ 2012, g ++ 4.7.2 y Clang ++ 3.1. Las declaraciones marcadas como "con formato incorrecto" fueron rechazadas por todos los compiladores).

Esto parece extraño porque el especificador de la clase de almacenamiento se aplica a la variable declarada. Es la variable declarada que esstatic, no el tipo de la variable declarada. Por qué sone yi mal formado, perok está bien formado?

¿Cuáles son las reglas que rigen la colocación válida de los especificadores de clase de almacenamiento? Mientras he usadostatic en este ejemplo, la pregunta se aplica a todos los especificadores de clase de almacenamiento. Preferiblemente, una respuesta completa debe citar secciones relevantes del estándar de lenguaje C ++ 11 y explicarlas.

Respuestas a la pregunta(3)

Su respuesta a la pregunta