Files
2025-10-25 03:02:53 +03:00

660 lines
34 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[class.mem.general]
# 11 Classes [[class]](./#class)
## 11.4 Class members [[class.mem]](class.mem#general)
### 11.4.1 General [class.mem.general]
[member-specification:](#nt:member-specification "11.4.1General[class.mem.general]")
[*member-declaration*](#nt:member-declaration "11.4.1General[class.mem.general]") [*member-specification*](#nt:member-specification "11.4.1General[class.mem.general]")opt
[*access-specifier*](class.derived.general#nt:access-specifier "11.7.1General[class.derived.general]") : [*member-specification*](#nt:member-specification "11.4.1General[class.mem.general]")opt
[member-declaration:](#nt:member-declaration "11.4.1General[class.mem.general]")
[*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt [*decl-specifier-seq*](dcl.spec.general#nt:decl-specifier-seq "9.2.1General[dcl.spec.general]")opt [*member-declarator-list*](#nt:member-declarator-list "11.4.1General[class.mem.general]")opt ;
[*function-definition*](dcl.fct.def.general#nt:function-definition "9.6.1General[dcl.fct.def.general]")
[*friend-type-declaration*](#nt:friend-type-declaration "11.4.1General[class.mem.general]")
[*using-declaration*](namespace.udecl#nt:using-declaration "9.10The using declaration[namespace.udecl]")
[*using-enum-declaration*](enum.udecl#nt:using-enum-declaration "9.8.2The using enum declaration[enum.udecl]")
[*static_assert-declaration*](dcl.pre#nt:static_assert-declaration "9.1Preamble[dcl.pre]")
[*consteval-block-declaration*](dcl.pre#nt:consteval-block-declaration "9.1Preamble[dcl.pre]")
[*template-declaration*](temp.pre#nt:template-declaration "13.1Preamble[temp.pre]")
[*explicit-specialization*](temp.expl.spec#nt:explicit-specialization "13.9.4Explicit specialization[temp.expl.spec]")
[*deduction-guide*](temp.deduct.guide#nt:deduction-guide "13.7.2.3Deduction guides[temp.deduct.guide]")
[*alias-declaration*](dcl.pre#nt:alias-declaration "9.1Preamble[dcl.pre]")
[*opaque-enum-declaration*](dcl.enum#nt:opaque-enum-declaration "9.8.1Enumeration declarations[dcl.enum]")
[*empty-declaration*](dcl.pre#nt:empty-declaration "9.1Preamble[dcl.pre]")
[member-declarator-list:](#nt:member-declarator-list "11.4.1General[class.mem.general]")
[*member-declarator*](#nt:member-declarator "11.4.1General[class.mem.general]")
[*member-declarator-list*](#nt:member-declarator-list "11.4.1General[class.mem.general]") , [*member-declarator*](#nt:member-declarator "11.4.1General[class.mem.general]")
[member-declarator:](#nt:member-declarator "11.4.1General[class.mem.general]")
[*declarator*](dcl.decl.general#nt:declarator "9.3.1General[dcl.decl.general]") [*virt-specifier-seq*](#nt:virt-specifier-seq "11.4.1General[class.mem.general]")opt [*function-contract-specifier-seq*](dcl.contract.func#nt:function-contract-specifier-seq "9.4.1General[dcl.contract.func]")opt [*pure-specifier*](#nt:pure-specifier "11.4.1General[class.mem.general]")opt
[*declarator*](dcl.decl.general#nt:declarator "9.3.1General[dcl.decl.general]") [*requires-clause*](temp.pre#nt:requires-clause "13.1Preamble[temp.pre]") [*function-contract-specifier-seq*](dcl.contract.func#nt:function-contract-specifier-seq "9.4.1General[dcl.contract.func]")opt
[*declarator*](dcl.decl.general#nt:declarator "9.3.1General[dcl.decl.general]") [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]")
[*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]")opt [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]")opt : [*constant-expression*](expr.const#nt:constant-expression "7.7Constant expressions[expr.const]") [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]")opt
[virt-specifier-seq:](#nt:virt-specifier-seq "11.4.1General[class.mem.general]")
[*virt-specifier*](#nt:virt-specifier "11.4.1General[class.mem.general]") [*virt-specifier-seq*](#nt:virt-specifier-seq "11.4.1General[class.mem.general]")opt
[virt-specifier:](#nt:virt-specifier "11.4.1General[class.mem.general]")
override
final
[pure-specifier:](#nt:pure-specifier "11.4.1General[class.mem.general]")
= 0
[friend-type-declaration:](#nt:friend-type-declaration "11.4.1General[class.mem.general]")
friend [*friend-type-specifier-list*](#nt:friend-type-specifier-list "11.4.1General[class.mem.general]") ;
[friend-type-specifier-list:](#nt:friend-type-specifier-list "11.4.1General[class.mem.general]")
[*friend-type-specifier*](#nt:friend-type-specifier "11.4.1General[class.mem.general]") ...opt
[*friend-type-specifier-list*](#nt:friend-type-specifier-list "11.4.1General[class.mem.general]") , [*friend-type-specifier*](#nt:friend-type-specifier "11.4.1General[class.mem.general]") ...opt
[friend-type-specifier:](#nt:friend-type-specifier "11.4.1General[class.mem.general]")
[*simple-type-specifier*](dcl.type.simple#nt:simple-type-specifier "9.2.9.3Simple type specifiers[dcl.type.simple]")
[*elaborated-type-specifier*](dcl.type.elab#nt:elaborated-type-specifier "9.2.9.5Elaborated type specifiers[dcl.type.elab]")
[*typename-specifier*](temp.res.general#nt:typename-specifier "13.8.1General[temp.res.general]")
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L616)
In the absence of a [*virt-specifier-seq*](#nt:virt-specifier-seq "11.4.1General[class.mem.general]"),
the token sequence = 0 is treated as a [*pure-specifier*](#nt:pure-specifier "11.4.1General[class.mem.general]") if the type of the [*declarator-id*](dcl.decl.general#nt:declarator-id "9.3.1General[dcl.decl.general]") ([[dcl.meaning.general]](dcl.meaning.general "9.3.4.1General"))
is a function type, and
is otherwise treated as a [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]")[.](#1.sentence-1)
[*Note [1](#note-1)*:
If the member declaration acquires a function type through
template instantiation,
the program is ill-formed; see [[temp.spec.general]](temp.spec.general "13.9.1General")[.](#1.sentence-2)
— *end note*]
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L628)
The optional [*function-contract-specifier-seq*](dcl.contract.func#nt:function-contract-specifier-seq "9.4.1General[dcl.contract.func]") ([[dcl.contract.func]](dcl.contract.func "9.4.1General"))
in a [*member-declarator*](#nt:member-declarator "11.4.1General[class.mem.general]") shall be present only if
the [*declarator*](dcl.decl.general#nt:declarator "9.3.1General[dcl.decl.general]") declares a function[.](#2.sentence-1)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L634)
The [*member-specification*](#nt:member-specification "11.4.1General[class.mem.general]") in a class definition declares the
full set of members of the class; no member can be added elsewhere[.](#3.sentence-1)
A [*direct member*](#def:member,direct "11.4.1General[class.mem.general]") of a class X is a member of X that was first declared within the [*member-specification*](#nt:member-specification "11.4.1General[class.mem.general]") of X,
including anonymous union members ([[class.union.anon]](class.union.anon "11.5.2Anonymous unions")) and direct members thereof[.](#3.sentence-2)
Members of a class are data members, member
functions ([[class.mfct]](class.mfct "11.4.2Member functions")), nested types, enumerators,
and member templates ([[temp.mem]](temp.mem "13.7.3Member templates")) and specializations thereof[.](#3.sentence-3)
[*Note [2](#note-2)*:
A specialization of a static data member template is a static data member[.](#3.sentence-4)
A specialization of a member function template is a member function[.](#3.sentence-5)
A specialization of a member class template is a nested class[.](#3.sentence-6)
— *end note*]
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L650)
A [*member-declaration*](#nt:member-declaration "11.4.1General[class.mem.general]") does not itself declare new members of the class
if it is
- [(4.1)](#4.1)
a friend declaration ([[class.friend]](class.friend "11.8.4Friends")),
- [(4.2)](#4.2)
a [*deduction-guide*](temp.deduct.guide#nt:deduction-guide "13.7.2.3Deduction guides[temp.deduct.guide]") ([[temp.deduct.guide]](temp.deduct.guide "13.7.2.3Deduction guides")),
- [(4.3)](#4.3)
a [*template-declaration*](temp.pre#nt:template-declaration "13.1Preamble[temp.pre]") whose [*declaration*](dcl.pre#nt:declaration "9.1Preamble[dcl.pre]") is one of the above,
- [(4.4)](#4.4)
a [*static_assert-declaration*](dcl.pre#nt:static_assert-declaration "9.1Preamble[dcl.pre]"),
- [(4.5)](#4.5)
a [*consteval-block-declaration*](dcl.pre#nt:consteval-block-declaration "9.1Preamble[dcl.pre]"),
- [(4.6)](#4.6)
a [*using-declaration*](namespace.udecl#nt:using-declaration "9.10The using declaration[namespace.udecl]") ([[namespace.udecl]](namespace.udecl "9.10The using declaration")), or
- [(4.7)](#4.7)
an [*empty-declaration*](dcl.pre#nt:empty-declaration "9.1Preamble[dcl.pre]")[.](#4.sentence-1)
For any other [*member-declaration*](#nt:member-declaration "11.4.1General[class.mem.general]"),
each declared entity
that is not an [unnamed bit-field](class.bit#def:bit-field,unnamed "11.4.10Bit-fields[class.bit]") is a member of the class,
and each such [*member-declaration*](#nt:member-declaration "11.4.1General[class.mem.general]") shall either
declare at least one member name of the class
or declare at least one unnamed bit-field[.](#4.sentence-2)
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L671)
A [*data member*](#def:data_member "11.4.1General[class.mem.general]") is a non-function member introduced by a[*member-declarator*](#nt:member-declarator "11.4.1General[class.mem.general]")[.](#5.sentence-1)
A [*member function*](#def:member_function "11.4.1General[class.mem.general]") is a member that is a function[.](#5.sentence-2)
Nested types are classes ([[class.name]](class.name "11.3Class names"), [[class.nest]](class.nest "11.4.12Nested class declarations")) and
enumerations ([[dcl.enum]](dcl.enum "9.8.1Enumeration declarations")) declared in the class and arbitrary types
declared as members by use of a typedef declaration ([[dcl.typedef]](dcl.typedef "9.2.4The typedef specifier"))
or [*alias-declaration*](dcl.pre#nt:alias-declaration "9.1Preamble[dcl.pre]")[.](#5.sentence-3)
The enumerators of an [unscoped enumeration](dcl.enum "9.8.1Enumeration declarations[dcl.enum]") defined in the class
are members of the class[.](#5.sentence-4)
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L682)
A data member or member function
may be declared static in its [*member-declaration*](#nt:member-declaration "11.4.1General[class.mem.general]"),
in which case it is a [*static member*](#def:member,static "11.4.1General[class.mem.general]") (see [[class.static]](class.static "11.4.9Static members"))
(a [*static data member*](#def:data_member,static "11.4.1General[class.mem.general]") ([[class.static.data]](class.static.data "11.4.9.3Static data members")) or[*static member function*](#def:member_function,static "11.4.1General[class.mem.general]") ([[class.static.mfct]](class.static.mfct "11.4.9.2Static member functions")), respectively)
of the class[.](#6.sentence-1)
Any other data member or member function is a [*non-static member*](#def:member,non-static "11.4.1General[class.mem.general]") (a [*non-static data member*](#def:data_member,non-static "11.4.1General[class.mem.general]") or[*non-static member function*](#def:member_function,non-static "11.4.1General[class.mem.general]") ([[class.mfct.non.static]](class.mfct.non.static "11.4.3Non-static member functions")), respectively)[.](#6.sentence-2)
[7](#7)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L693)
Every object of class type has a unique member subobject
corresponding to each of its direct non-static data members[.](#7.sentence-1)
If any non-static data member of a class C is of reference type,
then let D be an invented class
that is identical to C except that each non-static member of D corresponding to
a member of C of type “reference to T”
instead has type “pointer to T”[.](#7.sentence-2)
Every member subobject of a complete object of type C has the same size, alignment, and offset
as that of the corresponding subobject of a complete object of type D[.](#7.sentence-3)
The size and alignment of C are the same as
the size and alignment of D[.](#7.sentence-4)
[8](#8)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L708)
A member shall not be declared twice in the[*member-specification*](#nt:member-specification "11.4.1General[class.mem.general]"), except that
- [(8.1)](#8.1)
a nested class or member
class template can be declared and then later defined, and
- [(8.2)](#8.2)
an
enumeration can be introduced with an [*opaque-enum-declaration*](dcl.enum#nt:opaque-enum-declaration "9.8.1Enumeration declarations[dcl.enum]") and later
redeclared with an [*enum-specifier*](dcl.enum#nt:enum-specifier "9.8.1Enumeration declarations[dcl.enum]")[.](#8.sentence-1)
[*Note [3](#note-3)*:
A single name can denote several member functions provided their types
are sufficiently different ([[basic.scope.scope]](basic.scope.scope "6.4.1General"))[.](#8.sentence-2)
— *end note*]
[9](#9)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L723)
A redeclaration of a class member outside its class definition shall be
a definition,
an explicit specialization, or
an explicit instantiation ([[temp.expl.spec]](temp.expl.spec "13.9.4Explicit specialization"), [[temp.explicit]](temp.explicit "13.9.3Explicit instantiation"))[.](#9.sentence-1)
The member shall not be a non-static data member[.](#9.sentence-2)
[10](#10)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L730)
A [*complete-class context*](#def:complete-class_context "11.4.1General[class.mem.general]") of a class (template) is a
- [(10.1)](#10.1)
function body ([[dcl.fct.def.general]](dcl.fct.def.general "9.6.1General")),
- [(10.2)](#10.2)
default argument ([[dcl.fct.default]](dcl.fct.default "9.3.4.7Default arguments")),
- [(10.3)](#10.3)
default template argument ([[temp.param]](temp.param "13.2Template parameters")),
- [(10.4)](#10.4)
[*noexcept-specifier*](except.spec#nt:noexcept-specifier "14.5Exception specifications[except.spec]") ([[except.spec]](except.spec "14.5Exception specifications")),
- [(10.5)](#10.5)
[*function-contract-specifier*](dcl.contract.func#nt:function-contract-specifier "9.4.1General[dcl.contract.func]") ([[dcl.contract.func]](dcl.contract.func "9.4.1General")), or
- [(10.6)](#10.6)
default member initializer
within the [*member-specification*](#nt:member-specification "11.4.1General[class.mem.general]") of the class or class template[.](#10.sentence-1)
[*Note [4](#note-4)*:
A complete-class context of a nested class is also a complete-class
context of any enclosing class, if the nested class is defined within
the [*member-specification*](#nt:member-specification "11.4.1General[class.mem.general]") of the enclosing class[.](#10.sentence-2)
— *end note*]
[11](#11)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L748)
A class C is complete at a program point P if the definition of C is reachable from P ([[module.reach]](module.reach "10.7Reachability"))
or if P is in a complete-class context of C[.](#11.sentence-1)
Otherwise, C is incomplete at P[.](#11.sentence-2)
[12](#12)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L754)
If a [*member-declaration*](#nt:member-declaration "11.4.1General[class.mem.general]") matches
the syntactic requirements of [*friend-type-declaration*](#nt:friend-type-declaration "11.4.1General[class.mem.general]"),
it is a [*friend-type-declaration*](#nt:friend-type-declaration "11.4.1General[class.mem.general]")[.](#12.sentence-1)
[13](#13)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L759)
In a [*member-declarator*](#nt:member-declarator "11.4.1General[class.mem.general]"),
an = immediately following the [*declarator*](dcl.decl.general#nt:declarator "9.3.1General[dcl.decl.general]") is interpreted as introducing a [*pure-specifier*](#nt:pure-specifier "11.4.1General[class.mem.general]") if the [*declarator-id*](dcl.decl.general#nt:declarator-id "9.3.1General[dcl.decl.general]") has function type,
otherwise it is interpreted as introducing
a [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]")[.](#13.sentence-1)
[*Example [1](#example-1)*: struct S {using T = void();
T * p = 0; // OK, [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]")virtual T f = 0; // OK, [*pure-specifier*](#nt:pure-specifier "11.4.1General[class.mem.general]")}; — *end example*]
[14](#14)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L776)
In a [*member-declarator*](#nt:member-declarator "11.4.1General[class.mem.general]") for a bit-field,
the [*constant-expression*](expr.const#nt:constant-expression "7.7Constant expressions[expr.const]") is parsed as
the longest sequence of tokens
that could syntactically form a [*constant-expression*](expr.const#nt:constant-expression "7.7Constant expressions[expr.const]")[.](#14.sentence-1)
[*Example [2](#example-2)*: int a;const int b = 0;struct S {int x1 : 8 = 42; // OK, "= 42" is [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]")int x2 : 8 { 42 }; // OK, "{ 42 }" is [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]")int y1 : true ? 8 : a = 42; // OK, [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]") is absentint y2 : true ? 8 : b = 42; // error: cannot assign to const intint y3 : (true ? 8 : b) = 42; // OK, "= 42" is [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]")int z : 1 || new int { 0 }; // OK, [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]") is absent}; — *end example*]
[15](#15)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L796)
A [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]") shall appear only in the
declaration of a data member[.](#15.sentence-1)
(For static data members,
see [[class.static.data]](class.static.data "11.4.9.3Static data members"); for non-static data members,
see [[class.base.init]](class.base.init "11.9.3Initializing bases and members") and [[dcl.init.aggr]](dcl.init.aggr "9.5.2Aggregates"))[.](#15.sentence-2)
A [*brace-or-equal-initializer*](dcl.init.general#nt:brace-or-equal-initializer "9.5.1General[dcl.init.general]") for a non-static data memberspecifies a [*default member initializer*](#def:default_member_initializer "11.4.1General[class.mem.general]") for the member, and
shall not directly or indirectly cause the implicit definition of a
defaulted default constructor for the enclosing class or the
exception specification of that constructor[.](#15.sentence-3)
An immediate invocation ([[expr.const]](expr.const "7.7Constant expressions")) that
is a potentially-evaluated subexpression ([[intro.execution]](intro.execution "6.10.1Sequential execution"))
of a default member initializer
is neither evaluated nor checked for whether it
is a constant expression at the point where the subexpression appears[.](#15.sentence-4)
[16](#16)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L813)
A member shall not be declared with the extern[*storage-class-specifier*](dcl.stc#nt:storage-class-specifier "9.2.2Storage class specifiers[dcl.stc]")[.](#16.sentence-1)
Within a class definition, a member shall not be declared with the thread_local [*storage-class-specifier*](dcl.stc#nt:storage-class-specifier "9.2.2Storage class specifiers[dcl.stc]") unless also declared static[.](#16.sentence-2)
[17](#17)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L817)
The [*decl-specifier-seq*](dcl.spec.general#nt:decl-specifier-seq "9.2.1General[dcl.spec.general]") may be omitted in constructor, destructor,
and conversion function declarations only;
when declaring another kind of member the [*decl-specifier-seq*](dcl.spec.general#nt:decl-specifier-seq "9.2.1General[dcl.spec.general]") shall contain a [*type-specifier*](dcl.type.general#nt:type-specifier "9.2.9.1General[dcl.type.general]") that is not a [*cv-qualifier*](dcl.decl.general#nt:cv-qualifier "9.3.1General[dcl.decl.general]")[.](#17.sentence-1)
The[*member-declarator-list*](#nt:member-declarator-list "11.4.1General[class.mem.general]") can be omitted only after a[*class-specifier*](class.pre#nt:class-specifier "11.1Preamble[class.pre]") or an [*enum-specifier*](dcl.enum#nt:enum-specifier "9.8.1Enumeration declarations[dcl.enum]") or in a[friend declaration](class.friend "11.8.4Friends[class.friend]")[.](#17.sentence-2)
A[*pure-specifier*](#nt:pure-specifier "11.4.1General[class.mem.general]") shall be used only in the declaration of a[virtual function](class.virtual "11.7.3Virtual functions[class.virtual]") that is not a friend declaration[.](#17.sentence-3)
[18](#18)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L830)
The optional [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1Attribute syntax and semantics[dcl.attr.grammar]") in a [*member-declaration*](#nt:member-declaration "11.4.1General[class.mem.general]") appertains to each of the entities declared by the [*member-declarator*](#nt:member-declarator "11.4.1General[class.mem.general]")*s*;
it shall not appear if the optional [*member-declarator-list*](#nt:member-declarator-list "11.4.1General[class.mem.general]") is omitted[.](#18.sentence-1)
[19](#19)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L835)
A [*virt-specifier-seq*](#nt:virt-specifier-seq "11.4.1General[class.mem.general]") shall contain at most one of each[*virt-specifier*](#nt:virt-specifier "11.4.1General[class.mem.general]")[.](#19.sentence-1)
A [*virt-specifier-seq*](#nt:virt-specifier-seq "11.4.1General[class.mem.general]") shall appear only in the first declaration of a virtual member
function ([[class.virtual]](class.virtual "11.7.3Virtual functions"))[.](#19.sentence-2)
[20](#20)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L842)
The type of a non-static data member shall not be an
incomplete type ([[basic.types.general]](basic.types.general#term.incomplete.type "6.9.1General")),
an abstract class type ([[class.abstract]](class.abstract "11.7.4Abstract classes")),
or a (possibly multidimensional) array thereof[.](#20.sentence-1)
[*Note [5](#note-5)*:
In particular, a class C cannot contain
a non-static member of class C,
but it can contain a pointer or reference to an object of class C[.](#20.sentence-2)
— *end note*]
[21](#21)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L854)
[*Note [6](#note-6)*:
See [[expr.prim.id]](expr.prim.id "7.5.5Names") for restrictions on the use of non-static data
members and non-static member functions[.](#21.sentence-1)
— *end note*]
[22](#22)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L860)
[*Note [7](#note-7)*:
The type of a non-static member function is an ordinary function type,
and the type of a non-static data member is an ordinary object type[.](#22.sentence-1)
There are no special member function types or data member types[.](#22.sentence-2)
— *end note*]
[23](#23)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L867)
[*Example [3](#example-3)*:
A simple example of a class definition isstruct tnode {char tword[20]; int count;
tnode* left;
tnode* right;}; which contains an array of twenty characters, an integer, and two
pointers to objects of the same type[.](#23.sentence-1)
Once this definition has been
given, the declarationtnode s, *sp; declares s to be a tnode and sp to be a pointer
to a tnode[.](#23.sentence-2)
With these declarations, sp->count refers to
the count member of the object to which sp points;s.left refers to the left subtree pointer of the objects; and s.right->tword[0] refers to the initial character
of the tword member of the right subtree of s[.](#23.sentence-3)
— *end example*]
[24](#24)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L892)
[*Note [8](#note-8)*:
Non-variant non-static data members of
non-zero size ([[intro.object]](intro.object "6.8.2Object model"))
are allocated so that later
members have higher addresses within a class object ([[expr.rel]](expr.rel "7.6.9Relational operators"))[.](#24.sentence-1)
Implementation alignment requirements can cause two adjacent members
not to be allocated immediately after each other; so can requirements
for space for managing virtual functions ([[class.virtual]](class.virtual "11.7.3Virtual functions")) and
virtual base classes ([[class.mi]](class.mi "11.7.2Multiple base classes"))[.](#24.sentence-2)
— *end note*]
[25](#25)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L905)
If T is the name of a class, then each of the following shall
have a name different from T:
- [(25.1)](#25.1)
every static data member of class T;
- [(25.2)](#25.2)
every member function of class T;
[*Note [9](#note-9)*:
This restriction does not apply to constructors, which do not have
names ([[class.ctor]](class.ctor "11.4.5Constructors"))[.](#25.2.sentence-1)
— *end note*]
- [(25.3)](#25.3)
every member of class T that is itself a type;
- [(25.4)](#25.4)
every member template of class T;
- [(25.5)](#25.5)
every enumerator of every member of class T that is an
unscoped enumeration type; and
- [(25.6)](#25.6)
every member of every anonymous union that is a member of classT[.](#25.sentence-1)
[26](#26)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L928)
In addition, if class T has a user-declared[constructor](class.ctor "11.4.5Constructors[class.ctor]"), every non-static data member of classT shall have a name different from T[.](#26.sentence-1)
[27](#27)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L933)
The [*common initial sequence*](#def:common_initial_sequence "11.4.1General[class.mem.general]") of two standard-layout struct ([[class.prop]](class.prop "11.2Properties of classes"))
types is the longest sequence of non-static data
members and bit-fields in declaration order, starting with the first
such entity in each of the structs, such that
- [(27.1)](#27.1)
corresponding entities
have layout-compatible types ([[basic.types]](basic.types "6.9Types")),
- [(27.2)](#27.2)
corresponding entities have the same alignment requirements ([[basic.align]](basic.align "6.8.3Alignment")),
- [(27.3)](#27.3)
if a [*has-attribute-expression*](cpp.cond#nt:has-attribute-expression "15.2Conditional inclusion[cpp.cond]") ([[cpp.cond]](cpp.cond "15.2Conditional inclusion"))
is not 0 for the no_unique_address attribute,
then neither entity is declared with
the no_unique_address attribute ([[dcl.attr.nouniqueaddr]](dcl.attr.nouniqueaddr "9.13.11No unique address attribute")), and
- [(27.4)](#27.4)
either both entities are bit-fields with the same width
or neither is a bit-field[.](#27.sentence-1)
[*Example [4](#example-4)*: struct A { int a; char b; };struct B { const int b1; volatile char b2; };struct C { int c; unsigned : 0; char b; };struct D { int d; char b : 4; };struct E { unsigned int e; char b; };
The common initial sequence of A and B comprises all members
of either class[.](#27.sentence-2)
The common initial sequence of A and C and
of A and D comprises the first member in each case[.](#27.sentence-3)
The common initial sequence of A and E is empty[.](#27.sentence-4)
— *end example*]
[28](#28)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L967)
Two standard-layout struct ([[class.prop]](class.prop "11.2Properties of classes")) types are[*layout-compatible classes*](#def:layout-compatible,class "11.4.1General[class.mem.general]") if
their common initial sequence comprises all members and bit-fields of
both classes ([[basic.types]](basic.types "6.9Types"))[.](#28.sentence-1)
[29](#29)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L973)
Two standard-layout unions are layout-compatible if they
have the same number of non-static data members and corresponding
non-static data members (in any order) have layout-compatible
types ([[basic.types.general]](basic.types.general#term.layout.compatible.type "6.9.1General"))[.](#29.sentence-1)
[30](#30)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L979)
In a standard-layout union with an [active member](class.union#def:active,union_member "11.5Unions[class.union]") of struct type T1, it is permitted to read a non-static
data member m of another union member of struct type T2 provided m is part of the common initial sequence of T1 and T2;
the behavior is as if the corresponding member of T1 were nominated[.](#30.sentence-1)
[*Example [5](#example-5)*: struct T1 { int a, b; };struct T2 { int c; double d; };union U { T1 t1; T2 t2; };int f() { U u = { { 1, 2 } }; // active member is t1return u.t2.c; // OK, as if u.t1.a were nominated} — *end example*]
[*Note [10](#note-10)*:
Reading a volatile object through a glvalue of non-volatile type has
undefined behavior ([[dcl.type.cv]](dcl.type.cv "9.2.9.2The cv-qualifiers"))[.](#30.sentence-2)
— *end note*]
[31](#31)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L1001)
If a standard-layout class object has any non-static data members, its address
is the same as the address of its first non-static data member
if that member is not a bit-field[.](#31.sentence-1)
Its
address is also the same as the address of each of its base class subobjects[.](#31.sentence-2)
[*Note [11](#note-11)*:
There can therefore be unnamed padding within a standard-layout struct object
inserted by an implementation, but
not at its beginning, as necessary to achieve appropriate alignment[.](#31.sentence-3)
— *end note*]
[*Note [12](#note-12)*:
The object and its first subobject are
pointer-interconvertible ([[basic.compound]](basic.compound "6.9.4Compound types"), [[expr.static.cast]](expr.static.cast "7.6.1.9Static cast"))[.](#31.sentence-4)
— *end note*]
[32](#32)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L1016)
A [*data member description*](#def:description,data_member "11.4.1General[class.mem.general]") is
a quintuple (T, N, A, W, NUA)
describing the potential declaration of a non-static data member where
- [(32.1)](#32.1)
T is a type,
- [(32.2)](#32.2)
N is an [*identifier*](lex.name#nt:identifier "5.11Identifiers[lex.name]") or ⊥,
- [(32.3)](#32.3)
A is an alignment or ⊥,
- [(32.4)](#32.4)
W is a bit-field width or ⊥, and
- [(32.5)](#32.5)
NUA is a boolean value[.](#32.sentence-1)
Two data member descriptions are equal
if each of their respective components are the same entities,
are the same identifiers, have equal values, or are both ⊥[.](#32.sentence-2)
[*Note [13](#note-13)*:
The components of a data member description describe a data member such that
- [(32.6)](#32.6)
its type is specified using the type given by T,
- [(32.7)](#32.7)
it is declared with the name given by N if N is not ⊥ and is otherwise unnamed,
- [(32.8)](#32.8)
it is declared with the [*alignment-specifier*](dcl.attr.grammar#nt:alignment-specifier "9.13.1Attribute syntax and semantics[dcl.attr.grammar]") ([[dcl.align]](dcl.align "9.13.2Alignment specifier"))
given by alignas(A) if A is not ⊥ and
is otherwise declared without an [*alignment-specifier*](dcl.attr.grammar#nt:alignment-specifier "9.13.1Attribute syntax and semantics[dcl.attr.grammar]"),
- [(32.9)](#32.9)
it is a bit-field ([[class.bit]](class.bit "11.4.10Bit-fields")) with the width given by W if W is not ⊥ and is otherwise not a bit-field, and
- [(32.10)](#32.10)
it is declared with
the attribute [[no_unique_address]] ([[dcl.attr.nouniqueaddr]](dcl.attr.nouniqueaddr "9.13.11No unique address attribute"))
if NUA is true and is otherwise declared without that attribute[.](#32.sentence-3)
Data member descriptions are represented by reflections ([[basic.fundamental]](basic.fundamental "6.9.2Fundamental types"))
returned by std::meta::data_member_spec ([[meta.reflection.define.aggregate]](meta.reflection.define.aggregate "21.4.16Reflection class definition generation")) and
can be reified as data members of a class using std::meta::define_aggregate[.](#32.sentence-4)
— *end note*]