Подтвердить что ты не робот

Доступ к частной статической функции при инициализации статического члена

У меня есть класс со статическим членом. Это будет инициализировано с помощью частной статической функции того же класса.

#include <iostream>
#include <string>

class A
{
public:
    static std::string const s;

private:
    static std::string make()
    {
        return "S";
    }
};

std::string const A::s = A::make();

int main()
{
    std::cout << A::s << std::endl;
    // std::cout << A::make() << std::endl; // <-- Does not work
    return 0;
}

Мой вопрос: из-за чего это разрешено? Очевидно, что комментируемая часть не работает, потому что мне не разрешено обращаться к частной функции извне класса. Итак, почему инициализация частного статического члена во время запуска является специальным случаем? (И на стороне примечания: каково намерение этого правила? Разрешить ли этот конкретный случай?)

Мне известны другие механизмы инициализации статического члена (например: Инициализация частных статических элементов). Но в моем случае член const, насколько я знаю, единственный способ его установить - это прямое инициализация в месте определения.

4b9b3361

Ответ 1

Поскольку инициализация статического элемента данных считается частью характеристики класса, даже если элемент статических данных определен в области пространства имен (вне определения класса).

Из стандарта $9.2.3.2/2 Статические члены данных [Class.static.data]:

(акцент мой)

Инициализационное выражение в определении статического элемента данных находится в области его класса ([basic.scope.class]).

[Пример:

class process {
  static process* run_chain;
  static process* running;
};

process* process::running = get_main();
process* process::run_chain = running;

Член статических данных run_chain класса process определяется в глобальном объем; обозначение process::run_chain указывает, что член run_chain является членом класса process и в области класса process. В определении статического члена данных инициализатор выражение относится к статическому элементу данных running класса process. - конец примера]