Доступ к частной статической функции при инициализации статического члена
У меня есть класс со статическим членом. Это будет инициализировано с помощью частной статической функции того же класса.
#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, насколько я знаю, единственный способ его установить - это прямое инициализация в месте определения.
Ответы
Ответ 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
. - конец примера]