Где в объявлении может быть указан спецификатор класса хранения?
Например, пустьсstatic
спецификатор класса хранения. Вот несколько примеров правильного и неправильного использования этого спецификатора класса хранения:
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
(Декларации помечены "действительный» были приняты Visual C ++ 2012, g ++ 4.7.2 и Clang ++ 3.1. Декларации с пометкойплохо сформирован» были отклонены всеми этими компиляторами.)
Это кажется странным, потому что спецификатор класса хранения применяется к объявленной переменной. Это объявленная переменная, котораяstatic
, а не тип объявленной переменной. Почемуe
а такжеi
плохо сформирован, ноk
хорошо сформирован?
Какие правила определяют правильное размещение спецификаторов классов хранения? В то время как я'мы использовалиstatic
в этом примере вопрос относится ко всем спецификаторам классов хранения. Желательно, чтобы в полном ответе содержались ссылки на соответствующие разделы стандарта языка C ++ 11 и их пояснения.