variable usar funcion estaticas estatica ejemplos cuando c++ initialization language-lawyer static-methods static-members

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 del process de clase se define en el alcance global; el process::run_chain notación process::run_chain especifica que el miembro run_chain es un miembro del process de clase y en el alcance del process 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 se running en el process de clase. - ejemplo final]