У меня есть класс со статическим членом. Это будет инициализировано с помощью частной статической функции того же класса.Доступ к частной статической функции при инициализации статического члена
#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, насколько я знаю, единственный способ его установить - это прямое инициализация в месте определения.
Вы правы в отношении const. Отредактировал вопрос. Благодарю. –
Я думаю, что это было бы яснее: «Инициализация статического члена данных считается частью характеристики класса, даже если элемент статических данных определен в области пространства имен (вне определения класса)». (Я использовал «характеристику», потому что «определение класса» имеет очень формальный смысл в стандарте C++.) –
@MartinBonner Fine. – songyuanyao