[class.pre] # 11 Classes [[class]](./#class) ## 11.1 Preamble [class.pre] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L11) A class is a type[.](#1.sentence-1) Its name becomes a [*class-name*](#nt:class-name "11.1 Preamble [class.pre]") ([[class.name]](class.name "11.3 Class names")) within its scope[.](#1.sentence-2) [class-name:](#nt:class-name "11.1 Preamble [class.pre]") [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]") [*simple-template-id*](temp.names#nt:simple-template-id "13.3 Names of template specializations [temp.names]") A [*class-specifier*](#nt:class-specifier "11.1 Preamble [class.pre]") or an [*elaborated-type-specifier*](dcl.type.elab#nt:elaborated-type-specifier "9.2.9.5 Elaborated type specifiers [dcl.type.elab]") ([[dcl.type.elab]](dcl.type.elab "9.2.9.5 Elaborated type specifiers")) is used to make a [*class-name*](#nt:class-name "11.1 Preamble [class.pre]")[.](#1.sentence-3) An object of a class consists of a (possibly empty) sequence of members and base class objects[.](#1.sentence-4) [class-specifier:](#nt:class-specifier "11.1 Preamble [class.pre]") [*class-head*](#nt:class-head "11.1 Preamble [class.pre]") { [*member-specification*](class.mem.general#nt:member-specification "11.4.1 General [class.mem.general]")opt } [class-head:](#nt:class-head "11.1 Preamble [class.pre]") [*class-key*](#nt:class-key "11.1 Preamble [class.pre]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt [*class-head-name*](#nt:class-head-name "11.1 Preamble [class.pre]") [*class-property-specifier-seq*](#nt:class-property-specifier-seq "11.1 Preamble [class.pre]")opt [*base-clause*](class.derived.general#nt:base-clause "11.7.1 General [class.derived.general]")opt [*class-key*](#nt:class-key "11.1 Preamble [class.pre]") [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]")opt [*base-clause*](class.derived.general#nt:base-clause "11.7.1 General [class.derived.general]")opt [class-head-name:](#nt:class-head-name "11.1 Preamble [class.pre]") [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]")opt [*class-name*](#nt:class-name "11.1 Preamble [class.pre]") [class-property-specifier-seq:](#nt:class-property-specifier-seq "11.1 Preamble [class.pre]") [*class-property-specifier*](#nt:class-property-specifier "11.1 Preamble [class.pre]") [*class-property-specifier-seq*](#nt:class-property-specifier-seq "11.1 Preamble [class.pre]")opt [class-property-specifier:](#nt:class-property-specifier "11.1 Preamble [class.pre]") final trivially_relocatable_if_eligible replaceable_if_eligible [class-key:](#nt:class-key "11.1 Preamble [class.pre]") class struct union A class declaration where the [*class-name*](#nt:class-name "11.1 Preamble [class.pre]") in the [*class-head-name*](#nt:class-head-name "11.1 Preamble [class.pre]") is a [*simple-template-id*](temp.names#nt:simple-template-id "13.3 Names of template specializations [temp.names]") shall be an explicit specialization ([[temp.expl.spec]](temp.expl.spec "13.9.4 Explicit specialization")) or a partial specialization ([[temp.spec.partial]](temp.spec.partial "13.7.6 Partial specialization"))[.](#1.sentence-5) A [*class-specifier*](#nt:class-specifier "11.1 Preamble [class.pre]") whose[*class-head*](#nt:class-head "11.1 Preamble [class.pre]") omits the[*class-head-name*](#nt:class-head-name "11.1 Preamble [class.pre]") defines an [*unnamed class*](#def:class,unnamed "11.1 Preamble [class.pre]")[.](#1.sentence-6) [*Note [1](#note-1)*: An unnamed class thus can't be final[.](#1.sentence-7) — *end note*] Otherwise, the [*class-name*](#nt:class-name "11.1 Preamble [class.pre]") is an [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]"); it is not looked up, and the [*class-specifier*](#nt:class-specifier "11.1 Preamble [class.pre]") introduces it[.](#1.sentence-8) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L81) The component name of the[*class-name*](#nt:class-name "11.1 Preamble [class.pre]") is also bound in the scope of the class (template) itself; this is known as the [*injected-class-name*](#def:injected-class-name "11.1 Preamble [class.pre]")[.](#2.sentence-1) For purposes of access checking, the injected-class-name is treated as if it were a public member name[.](#2.sentence-2) A [*class-specifier*](#nt:class-specifier "11.1 Preamble [class.pre]") is commonly referred to as a [*class definition*](#def:definition,class "11.1 Preamble [class.pre]")[.](#2.sentence-3) A class is considered defined after the closing brace of its[*class-specifier*](#nt:class-specifier "11.1 Preamble [class.pre]") has been seen even though its member functions are in general not yet defined[.](#2.sentence-4) The optional [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]") appertains to the class; the attributes in the [*attribute-specifier-seq*](dcl.attr.grammar#nt:attribute-specifier-seq "9.13.1 Attribute syntax and semantics [dcl.attr.grammar]") are thereafter considered attributes of the class whenever it is named[.](#2.sentence-5) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L97) If a [*class-head-name*](#nt:class-head-name "11.1 Preamble [class.pre]") contains a [*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]"), the [*class-specifier*](#nt:class-specifier "11.1 Preamble [class.pre]") shall not inhabit a class scope[.](#3.sentence-1) If its [*class-name*](#nt:class-name "11.1 Preamble [class.pre]") is an [*identifier*](lex.name#nt:identifier "5.11 Identifiers [lex.name]"), the [*class-specifier*](#nt:class-specifier "11.1 Preamble [class.pre]") shall correspond to one or more declarations nominable in the class, class template, or namespace to which the[*nested-name-specifier*](expr.prim.id.qual#nt:nested-name-specifier "7.5.5.3 Qualified names [expr.prim.id.qual]") refers; they shall all have the same target scope, and the target scope of the[*class-specifier*](#nt:class-specifier "11.1 Preamble [class.pre]") is that scope[.](#3.sentence-2) [*Example [1](#example-1)*: namespace N {templatestruct A {struct B; };}using N::A;template struct A::B {}; // OKtemplate<> struct A {}; // OK — *end example*] [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L121) [*Note [2](#note-2)*: The [*class-key*](#nt:class-key "11.1 Preamble [class.pre]") determines whether the class is a union ([[class.union]](class.union "11.5 Unions")) and whether access is public or private by default ([[class.access]](class.access "11.8 Member access control"))[.](#4.sentence-1) A union holds the value of at most one data member at a time[.](#4.sentence-2) — *end note*] [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L129) Each [*class-property-specifier*](#nt:class-property-specifier "11.1 Preamble [class.pre]") shall appear at most once within a single [*class-property-specifier-seq*](#nt:class-property-specifier-seq "11.1 Preamble [class.pre]")[.](#5.sentence-1) Whenever a [*class-key*](#nt:class-key "11.1 Preamble [class.pre]") is followed by a [*class-head-name*](#nt:class-head-name "11.1 Preamble [class.pre]"), one of the identifiers final, trivially_relocatable_if_eligible, or replaceable_if_eligible, and a colon or left brace, the identifier is interpreted as a [*class-property-specifier*](#nt:class-property-specifier "11.1 Preamble [class.pre]")[.](#5.sentence-2) [*Example [2](#example-2)*: struct A;struct A final {}; // OK, definition of struct A,// not value-initialization of variable finalstruct X {struct C { constexpr operator int() { return 5; } }; struct B trivially_relocatable_if_eligible : C{}; // OK, definition of nested class B,// not declaration of a bit-field member// trivially_relocatable_if_eligible}; — *end example*] [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L153) If a class is marked with the [*class-property-specifier*](#nt:class-property-specifier "11.1 Preamble [class.pre]")final and that class appears as a [*class-or-decltype*](class.derived.general#nt:class-or-decltype "11.7.1 General [class.derived.general]") in a [*base-clause*](class.derived.general#nt:base-clause "11.7.1 General [class.derived.general]") ([[class.derived]](class.derived "11.7 Derived classes")), the program is ill-formed[.](#6.sentence-1) [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L158) [*Note [3](#note-3)*: Complete objects of class type have nonzero size[.](#7.sentence-1) Base class subobjects and members declared with the no_unique_address attribute ([[dcl.attr.nouniqueaddr]](dcl.attr.nouniqueaddr "9.13.11 No unique address attribute")) are not so constrained[.](#7.sentence-2) — *end note*] [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L166) [*Note [4](#note-4)*: Class objects can be assigned ([[over.assign]](over.assign "12.4.3.2 Simple assignment"), [[class.copy.assign]](class.copy.assign "11.4.6 Copy/move assignment operator")), passed as arguments to functions ([[dcl.init]](dcl.init "9.5 Initializers"), [[class.copy.ctor]](class.copy.ctor "11.4.5.3 Copy/move constructors")), and returned by functions (except objects of classes for which copying or moving has been restricted; see [[dcl.fct.def.delete]](dcl.fct.def.delete "9.6.3 Deleted definitions") and [[class.access]](class.access "11.8 Member access control"))[.](#8.sentence-1) Other plausible operators, such as equality comparison, can be defined by the user; see [[over.oper]](over.oper "12.4 Overloaded operators")[.](#8.sentence-2) — *end note*]