This commit is contained in:
2025-10-25 03:02:53 +03:00
commit 043225d523
3416 changed files with 681196 additions and 0 deletions

119
cppdraft/special.md Normal file
View 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.2Default constructors")),
copy constructors, move constructors ([[class.copy.ctor]](class.copy.ctor "11.4.5.3Copy/move constructors")),
copy assignment operators, move assignment operators ([[class.copy.assign]](class.copy.assign "11.4.6Copy/move assignment operator")),
and prospective destructors ([[class.dtor]](class.dtor "11.4.7Destructors")) 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.2Explicitly-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.1Preamble[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.8Member 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.1General[dcl.decl.general]")*s* and [*ref-qualifier*](dcl.decl.general#nt:ref-qualifier "9.3.1General[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.4Special 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.5Template 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.5Partial 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.4Abstract classes")), its virtual base
classes are called its [*potentially constructed subobjects*](#def:potentially_constructed_subobjects)[.](#7.sentence-1)