10

Ich habe eine Klasse mit einem statischen Mitglied. Dies wird mit einer privaten statischen Funktion derselben Klasse initialisiert.Zugriff auf private statische Funktion während der Initialisierung des statischen Elements

Meine Frage ist: Aufgrund welcher Regel ist das erlaubt? Offensichtlich funktioniert der kommentierte Teil nicht, weil ich nicht auf eine private Funktion außerhalb der Klasse zugreifen darf. Warum ist die Initialisierung des privaten statischen Members beim Start ein Sonderfall? (Und eine Randnotiz: Was ist die Absicht dieser Regel? Ist es, diesen genauen Fall zuzulassen?)

Ich kenne andere Mechanismen, um ein statisches Mitglied zu initialisieren (wie hier: Initializing private static members). Aber in meinem Fall ist das Mitglied const, und so weit ich weiß, kann man es nur durch direkte Initialisierung am Ort der Definition festlegen.

Antwort

8

Da die Initialisierung eines statischen Datenelements als Teil der Charakterisierung der Klasse betrachtet wird, obwohl das statische Datenelement im Namespacebereich definiert ist (außerhalb der Klassendefinition).

Von der Norm $9.2.3.2/2 Static data members [class.static.data]:

(emphasis Mine)

der Initialisierer Ausdruck in der Definition eines statischen Datenelementes in dem Rahmen seiner Klasse ([basic.scope. Klasse]).

[Beispiel:

class process { 
    static process* run_chain; 
    static process* running; 
}; 

process* process::running = get_main(); 
process* process::run_chain = running; 

Das statische Datenelement run_chain der Klasse process in globalem Umfang definiert ist; Die Notation process::run_chain gibt an, dass das Mitglied run_chain ein Mitglied der Klasse process und im Rahmen der Klasse process ist. In der statischen Datenelementdefinition bezieht sich der Ausdruck des Initialisierers auf das statische Datenelement running der Klasse process. - Ende Beispiel]

+1

Sie haben Recht über die const. Bearbeitete die Frage. Vielen Dank. –

+1

Ich denke, das wäre klarer als "Die Initialisierung eines statischen Datenelements wird als Teil der Charakterisierung der Klasse betrachtet, obwohl das statische Datenelement im Namespacebereich definiert ist (außerhalb der Klassendefinition)." (Ich habe "Charakterisierung" verwendet, weil "Klassendefinition" im C++ - Standard eine sehr formale Bedeutung hat.) –

+0

@MartinBonner Fine. – songyuanyao