Init
This commit is contained in:
163
cppdraft/class/pre.md
Normal file
163
cppdraft/class/pre.md
Normal file
@@ -0,0 +1,163 @@
|
||||
[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 {template<class>struct A {struct B; };}using N::A;template<class T> struct A<T>::B {}; // OKtemplate<> struct A<void> {}; // 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*]
|
||||
Reference in New Issue
Block a user