Files
cppdraft_translate/cppdraft/special.md
2025-10-25 03:02:53 +03:00

120 lines
4.5 KiB
Markdown
Raw 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.

[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)