c++ - usar - Acceso a la función estática privada durante la inicialización del miembro estático
static en c (1)
Tengo una clase con un miembro estático. Esto se inicializará usando una función estática privada de la misma clase.
#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;
}
Mi pregunta es: ¿por qué regla está permitido? Claramente, la parte comentada no funciona, porque no tengo permitido acceder a una función privada desde fuera de la clase. Entonces, ¿por qué la inicialización del miembro estático privado durante el inicio es un caso especial? (Y en una nota al margen: ¿cuál es la intención de esta regla? ¿Es para permitir este caso exacto?)
Conozco otros mecanismos para inicializar un miembro estático (como aquí: Inicializar miembros estáticos privados ). Pero en mi caso el miembro es const, por lo que yo sé, la única forma de establecerlo es a través de la inicialización directa en el lugar de la definición.
Debido a que la inicialización de un miembro de datos estáticos se considera parte de la caracterización de la clase, aunque el miembro de datos estáticos se define en el ámbito del espacio de nombres (fuera de la definición de la clase).
Del estándar, $ 9.2.3.2 / 2 miembros de datos estáticos [class.static.data] :
(énfasis mío)
La expresión del inicializador en la definición de un miembro de datos estáticos está en el alcance de su clase ([basic.scope.class]).
[Ejemplo:
class process { static process* run_chain; static process* running; }; process* process::running = get_main(); process* process::run_chain = running;
El miembro de datos estáticos
run_chain
delprocess
de clase se define en el alcance global; elprocess::run_chain
notaciónprocess::run_chain
especifica que el miembrorun_chain
es un miembro delprocess
de clase y en el alcance delprocess
de clase. En la definición de miembro de datos estáticos, la expresión de inicializador se refiere al miembro de datos estáticos que serunning
en elprocess
de clase. - ejemplo final]