A static data member is not part of the subobjects of a class. If a static data member is declared thread_Βlocal there is one copy of the member per thread. If a static data member is not declared thread_Βlocal there is one copy of the data member that is shared by all the objects of the class.
The declaration of a non-inline static data member in its class definition is not a definition and may be of an incomplete type other than cv void. The definition for a static data member that is not defined inline in the class definition shall appear in a namespace scope enclosing the member's class definition. In the definition at namespace scope, the name of the static data member shall be qualified by its class name using the β::β operator. The initializer expression in the definition of a static data member is in the scope of its class ([basic.scope.class]). [βExample:
class process { static process* run_chain; static process* running; }; process* process::running = get_main(); process* process::run_chain = running;
The static data member run_Βchain of class process is defined in global scope; the notation processβ::βrun_Βchain specifies that the member run_Βchain is a member of class process and in the scope of class process. In the static data member definition, the initializer expression refers to the static data member running of class process. βββend exampleβ]
[βNote: Once the static data member has been defined, it exists even if no objects of its class have been created. [βExample: In the example above, run_Βchain and running exist even if no objects of class process are created by the program. βββend exampleβ] βββend noteβ]
If a non-volatile non-inline const static data member is of integral or enumeration type, its declaration in the class definition can specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression ([expr.const]). The member shall still be defined in a namespace scope if it is odr-used in the program and the namespace scope definition shall not contain an initializer. An inline static data member may be defined in the class definition and may specify a brace-or-equal-initializer. If the member is declared with the constexpr specifier, it may be redeclared in namespace scope with no initializer (this usage is deprecated; see [depr.static_constexpr]). Declarations of other static data members shall not specify a brace-or-equal-initializer.
[βNote: There shall be exactly one definition of a static data member that is odr-used in a program; no diagnostic is required. βββend noteβ] Unnamed classes and classes contained directly or indirectly within unnamed classes shall not contain static data members.
[βNote: Static data members of a class in namespace scope have the linkage of that class. A local class cannot have static data members. βββend noteβ]
Static data members are initialized and destroyed exactly like non-local variables ([basic.start.static], [basic.start.dynamic], [basic.start.term]).