Init
This commit is contained in:
119
cppdraft/special.md
Normal file
119
cppdraft/special.md
Normal file
@@ -0,0 +1,119 @@
|
||||
[special]
|
||||
|
||||
# 11 Classes [[class]](./#class)
|
||||
|
||||
## 11.4 Class members [[class.mem]](class.mem#special)
|
||||
|
||||
### 11.4.4 Special member functions [special]
|
||||
|
||||
[1](#1)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L1154)
|
||||
|
||||
Default constructors ([[class.default.ctor]](class.default.ctor "11.4.5.2 Default constructors")),
|
||||
copy constructors, move constructors ([[class.copy.ctor]](class.copy.ctor "11.4.5.3 Copy/move constructors")),
|
||||
copy assignment operators, move assignment operators ([[class.copy.assign]](class.copy.assign "11.4.6 Copy/move assignment operator")),
|
||||
and prospective destructors ([[class.dtor]](class.dtor "11.4.7 Destructors")) are[*special member functions*](#def:special_member_functions)[.](#1.sentence-1)
|
||||
|
||||
[*Note [1](#note-1)*:
|
||||
|
||||
The implementation will implicitly declare these member functions for some class
|
||||
types when the program does not explicitly declare them[.](#1.sentence-2)
|
||||
|
||||
The implementation will implicitly define them
|
||||
as needed ([[dcl.fct.def.default]](dcl.fct.def.default "9.6.2 Explicitly-defaulted functions"))[.](#1.sentence-3)
|
||||
|
||||
â *end note*]
|
||||
|
||||
An implicitly-declared special member function is declared at the closing} of the [*class-specifier*](class.pre#nt:class-specifier "11.1 Preamble [class.pre]")[.](#1.sentence-4)
|
||||
|
||||
Programs shall not define implicitly-declared special member functions[.](#1.sentence-5)
|
||||
|
||||
[2](#2)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L1175)
|
||||
|
||||
Programs may explicitly refer to implicitly-declared special member functions[.](#2.sentence-1)
|
||||
|
||||
[*Example [1](#example-1)*:
|
||||
|
||||
A program may explicitly call or form a pointer to member
|
||||
to an implicitly-declared special member function[.](#2.sentence-2)
|
||||
|
||||
struct A { }; // implicitly declared A::operator=struct B : A { B& operator=(const B &);};
|
||||
B& B::operator=(const B& s) {this->A::operator=(s); // well-formedreturn *this;} â *end example*]
|
||||
|
||||
[3](#3)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L1193)
|
||||
|
||||
[*Note [2](#note-2)*:
|
||||
|
||||
The special member functions affect the way objects of class type are created,
|
||||
copied, moved, and destroyed, and how values can be converted to values of other types[.](#3.sentence-1)
|
||||
|
||||
Often such special member functions are called implicitly[.](#3.sentence-2)
|
||||
|
||||
â *end note*]
|
||||
|
||||
[4](#4)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L1200)
|
||||
|
||||
Special member functions obey the usual access rules ([[class.access]](class.access "11.8 Member access control"))[.](#4.sentence-1)
|
||||
|
||||
[*Example [2](#example-2)*:
|
||||
|
||||
Declaring a constructor protected
|
||||
ensures that only derived classes and friends can create objects using it[.](#4.sentence-2)
|
||||
|
||||
â *end example*]
|
||||
|
||||
[5](#5)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L1208)
|
||||
|
||||
Two special member functions are of the same kind if
|
||||
|
||||
- [(5.1)](#5.1)
|
||||
|
||||
they are both default constructors,
|
||||
|
||||
- [(5.2)](#5.2)
|
||||
|
||||
they are both copy or move constructors
|
||||
with the same first parameter type, or
|
||||
|
||||
- [(5.3)](#5.3)
|
||||
|
||||
they are both copy or move assignment operators
|
||||
with the same first parameter type
|
||||
and the same [*cv-qualifier*](dcl.decl.general#nt:cv-qualifier "9.3.1 General [dcl.decl.general]")*s* and [*ref-qualifier*](dcl.decl.general#nt:ref-qualifier "9.3.1 General [dcl.decl.general]"), if any[.](#5.sentence-1)
|
||||
|
||||
[6](#6)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L1219)
|
||||
|
||||
An [*eligible special member function*](#def:special_member_function,eligible "11.4.4 Special member functions [special]") is a special member function for which:
|
||||
|
||||
- [(6.1)](#6.1)
|
||||
|
||||
the function is not deleted,
|
||||
|
||||
- [(6.2)](#6.2)
|
||||
|
||||
the associated constraints ([[temp.constr]](temp.constr "13.5 Template constraints")), if any, are satisfied, and
|
||||
|
||||
- [(6.3)](#6.3)
|
||||
|
||||
no special member function of the same kind
|
||||
whose associated constraints, if any, are satisfied
|
||||
is more constrained ([[temp.constr.order]](temp.constr.order "13.5.5 Partial ordering by constraints"))[.](#6.sentence-1)
|
||||
|
||||
[7](#7)
|
||||
|
||||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/classes.tex#L1229)
|
||||
|
||||
For a class, its non-static data members, its non-virtual direct base classes,
|
||||
and, if the class is not abstract ([[class.abstract]](class.abstract "11.7.4 Abstract classes")), its virtual base
|
||||
classes are called its [*potentially constructed subobjects*](#def:potentially_constructed_subobjects)[.](#7.sentence-1)
|
||||
Reference in New Issue
Block a user