Почему "static" не может использоваться при определении (в отличие от объявления) статического члена данных "?

Я искал способы инициализации статической карты в С++ и нашел этот код:

struct A{
static map<int,int> create_map()
    {
      map<int,int> m;
      m[1] = 2;
      m[3] = 4;
      m[5] = 6;
      return m;
    }
static const map<int,int> myMap;

};

const map<int,int> A:: myMap =  A::create_map();

Однако, если я изменил последнюю строку на

const static map<int,int> A:: myMap =  A::create_map();

Жалобы компилятора: "static" не может использоваться при определении (в отличие от объявления) статического члена данных "?

Интересно, почему? Какая логика или рассуждение позади этого?

Ответ 1

static int    a = 0; // grandfathered and still useful, provides static *LINKAGE*
                     // and static STORAGE DURATION
static int X::a = 0; // confusing and illegal, is it static LINKAGE
                     // or static STORAGE DURATION
                     // or static MEMBERSHIP?

static уже имел смысл (в C) при использовании в определении переменной. Было бы очень удивительно, если бы программисты C изучали С++, чтобы определить, что значение иногда менялось, но не всегда.

Таким образом, новый смысл (статическое членство) активен только внутри определения класса (где C не допускает ключевое слово static).

Ответ 2

Это не отличается от

struct A
{
   static int x;
}

int A::x;         //legal
static int A::x;  //illegal

Все остальное - это просто больше ключевых слов, выведенных на этом минимальном, концептуально идентичном примере. Член static может быть объявлен только static внутри определения класса.

const map<int,int> A:: myMap =  A::create_map();

вне класса - это просто определение члена static A::myMap. Дополнительный static не имеет смысла там.

Обоснование этого, вероятно, заключается в том, чтобы избежать путаницы - свободная переменная static является видом переменной "private" (для единицы перевода). Член static является противоположным.

Ответ 3

Объявление члена класса static означает, что оно разделяется между всеми объектами этого класса.

Когда вы добавляете static к определению переменной вне класса, это означает, что эта переменная имеет область файла и не видна вне этого файла.

Если ему будет разрешено

const static map<int,int> A:: myMap =  A::create_map();

это означает, что у вас есть статическая переменная-член, которая не видна за пределами этого файла. Это просто не имеет смысла.