На статический член s класса X можно ссылаться с помощью qualified-idвыражения X::s; нет необходимости использовать class member access синтаксис для ссылки на статический член. На статический член можно ссылаться с использованием синтаксиса доступа к члену класса, и в этом случае вычисляется выражение объекта. [ Example:
struct process { static void reschedule(); }; process& g(); void f() { process::reschedule(); // OK: no object necessary g().reschedule(); // g() is called }
— end example ]
На статический член можно ссылаться непосредственно в области его класса или в области действия класса derived из своего класса; В этом случае статический член упоминаются как если qualified-idиспользовалось выражение, с nested-name-specifierиз qualified-idимен в области видимости класса , из которого ссылается статический член. [ Example:
int g();
struct X {
static int g();
};
struct Y : X {
static int i;
};
int Y::i = g(); // equivalent to Y::g();
— end example ]
Если unqualified-idиспользуется в определении статического члена, следующего за членом declarator-id, и name lookup обнаруживается, что это unqualified-idотносится к статическому члену, перечислителю или вложенному типу класса члена (или базового класса класса члена), то unqualified-idпреобразуется в qualified-idвыражение , в котором nested-name-specifierимена класс сферы применения , из которого ссылается элемент. [ Note: См. [expr.prim] Ограничения на использование нестатических элементов данных и нестатических функций-членов. ] — end note
Статические члены подчиняются обычному классу member access rules. При использовании в объявлении члена класса static спецификатор должен использоваться только в объявлениях члена, которые появляются внутри member-specificationопределения класса. [ Note: Его нельзя указывать в объявлениях членов, которые появляются в области пространства имен. ] — end note
[ Note: Правила, описанные в [class.mfct] разделе, применяются к статическим функциям-членам. ] — end note
[ Note: Статическая функция-член не имеет this pointer. ] Статической функции-члена быть не должно . Не должно быть статической и нестатической функции-члена с одним и тем же именем и одними и теми же типами параметров ( ). Функция - член статический не должен быть объявлен , или . — end note virtual[over.load] constvolatile const volatile
Статический член данных не является частью подобъектов класса. Если объявлен статический член данных, thread_local существует одна копия члена на поток. Если статический член данных не объявлен, thread_local существует одна копия члена данных, совместно используемая всеми объектами класса.
Объявление не встроенного статического члена данных в определении его класса не является определением и может иметь неполный тип, отличный от cv void. Определение статического члена данных, который не определен встроенным в определение класса, должно появиться в области пространства имен, включающей определение класса члена. В определении в области пространства имен имя статического элемента данных должно быть уточнено именем его класса с использованием :: оператора. initializerВыражение в определении члена статических данных в рамках своего класса ([basic.scope.class]). [ Example:
class process { static process* run_chain; static process* running; }; process* process::running = get_main(); process* process::run_chain = running;
Статический член run_chain данных класса process определяется в глобальной области видимости; обозначение process::run_chain указывает, что член run_chain является членом класса process и находится в области действия класса process. В определении статического члена данных initializerвыражение относится к статическому члену running данных класса process. ] — end example
[ Note: После определения статического элемента данных он существует, даже если объекты его класса не были созданы. [ Example: В приведенном выше примере run_chain и running существуют, даже если программа не process создает никаких объектов класса . ] ] — end example — end note
Если энергонезависимый не встроенный const статический член данных имеет целочисленный или перечисляемый тип, его объявление в определении класса может указывать a, brace-or-equal-initializerв котором каждый, initializer-clauseкоторый является, assignment-expression является постоянным выражением ([expr.const]). Этот член по-прежнему должен быть определен в области пространства имен, если он находится odr-used в программе, а определение области пространства имен не должно содержать initializer. Встроенный статический член данных может быть определен в определении класса и может указывать brace-or-equal-initializer. Если член объявлен со constexpr спецификатором, он может быть повторно объявлен в области пространства имен без инициализатора (это использование не рекомендуется; см. [depr.static_constexpr]). Объявления других статических элементов данных не должны указывать a brace-or-equal-initializer.
[ Note: В программе должно быть ровно одно определение статического элемента данных odr-used ; Диагностика не требуется. ] Безымянные классы и классы, прямо или косвенно содержащиеся в безымянных классах, не должны содержать статических элементов данных. — end note
[ Note: Статические элементы данных класса в области пространства имен имеют значение linkage этого класса. A local class не может иметь статических элементов данных. ] — end note
Статические элементы данных инициализируются и уничтожены точно так же как нелокальных переменных ([basic.start.static], [basic.start.dynamic], [basic.start.term]).