Какая функция используется для инициализации элемента статического класса? - программирование

Какая функция используется для инициализации элемента статического класса?

У меня вопрос о том, какая функция выбрана для инициализации статического члена класса.

//Base.h

class Base
{
private:
    static int count;
    static int countInit()
    {
        return 10;
    }
public:
    Base()
    {
    }
};

//and Base.cpp
static int countInit()
{
    return 0;
}
int Base::count=countInit();//member function is used.
static int local_count=countInit();//the local one in Base.cpp

Переменная Base::count инициализируется Base::countInit(), а не countInit(), определенной в Base.cpp. Но local_count инициализируется локальным countInit. Итак, интересно, существует ли в этом случае правило типа поиска Koenig?

4b9b3361

Ответ 1

После того, как вы напишете int Base::count, вы находитесь в классе Base, поэтому будет вызвана статическая функция класса. Здесь будет использован неквалифицированный поиск

из 3.4.2/13

Имя, используемое в определении статического элемента данных класса X (9.4.2) (после квалифицированного идентификатора статического член) выглядит так, как если бы имя использовалось в функции-члене X.

из 9.4.2

Определение для статического элемента данных должно появляться в пространстве имен который охватывает определение класса участников. В определении в области пространства имен имя статического член данных должен быть квалифицирован по его имени класса с помощью оператора::. Выражение инициализатора в определение статического элемента данных входит в область его класса

Пример:

class process {
static process* run_chain;
static process* running;
};
process* process::running = get_main();
process* process::run_chain = running;