10

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

#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; 
} 

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

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

ответ

8

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

От стандарта, $9.2.3.2/2 Static data members [class.static.data]:

(курсив мой)

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

[Пример:

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. - конец примера]

+1

Вы правы в отношении const. Отредактировал вопрос. Благодарю. –

+1

Я думаю, что это было бы яснее: «Инициализация статического члена данных считается частью характеристики класса, даже если элемент статических данных определен в области пространства имен (вне определения класса)». (Я использовал «характеристику», потому что «определение класса» имеет очень формальный смысл в стандарте C++.) –

+0

@MartinBonner Fine. – songyuanyao

Смежные вопросы