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