mirror of
https://github.com/isocpp/CppCoreGuidelines.git
synced 2025-12-17 20:54:41 +03:00
Closes #1647
This commit is contained in:
@@ -4490,7 +4490,7 @@ By default, C++ treats classes as value-like types, but not all types are value-
|
|||||||
Set of default operations rules:
|
Set of default operations rules:
|
||||||
|
|
||||||
* [C.20: If you can avoid defining any default operations, do](#Rc-zero)
|
* [C.20: If you can avoid defining any default operations, do](#Rc-zero)
|
||||||
* [C.21: If you define or `=delete` any default operation, define or `=delete` them all](#Rc-five)
|
* [C.21: If you define or `=delete` any copy, move, or destructor function, define or `=delete` them all](#Rc-five)
|
||||||
* [C.22: Make default operations consistent](#Rc-matched)
|
* [C.22: Make default operations consistent](#Rc-matched)
|
||||||
|
|
||||||
Destructor rules:
|
Destructor rules:
|
||||||
@@ -4578,29 +4578,25 @@ This is known as "the rule of zero".
|
|||||||
(Not enforceable) While not enforceable, a good static analyzer can detect patterns that indicate a possible improvement to meet this rule.
|
(Not enforceable) While not enforceable, a good static analyzer can detect patterns that indicate a possible improvement to meet this rule.
|
||||||
For example, a class with a (pointer, size) pair of member and a destructor that `delete`s the pointer could probably be converted to a `vector`.
|
For example, a class with a (pointer, size) pair of member and a destructor that `delete`s the pointer could probably be converted to a `vector`.
|
||||||
|
|
||||||
### <a name="Rc-five"></a>C.21: If you define or `=delete` any default operation, define or `=delete` them all
|
### <a name="Rc-five"></a>C.21: If you define or `=delete` any copy, move, or destructor function, define or `=delete` them all
|
||||||
|
|
||||||
##### Reason
|
##### Reason
|
||||||
|
|
||||||
The *special member functions* are the default constructor, copy constructor,
|
The semantics of copy, move, and destruction are closely related, so if one needs to be declared, the odds are that others need consideration too.
|
||||||
copy assignment operator, move constructor, move assignment operator, and
|
|
||||||
destructor.
|
|
||||||
|
|
||||||
The semantics of the special functions are closely related, so if one needs to be declared, the odds are that others need consideration too.
|
Declaring any copy/move/destructor function,
|
||||||
|
|
||||||
Declaring any special member function except a default constructor,
|
|
||||||
even as `=default` or `=delete`, will suppress the implicit declaration
|
even as `=default` or `=delete`, will suppress the implicit declaration
|
||||||
of a move constructor and move assignment operator.
|
of a move constructor and move assignment operator.
|
||||||
Declaring a move constructor or move assignment operator, even as
|
Declaring a move constructor or move assignment operator, even as
|
||||||
`=default` or `=delete`, will cause an implicitly generated copy constructor
|
`=default` or `=delete`, will cause an implicitly generated copy constructor
|
||||||
or implicitly generated copy assignment operator to be defined as deleted.
|
or implicitly generated copy assignment operator to be defined as deleted.
|
||||||
So as soon as any of the special functions is declared, the others should
|
So as soon as any of these are declared, the others should
|
||||||
all be declared to avoid unwanted effects like turning all potential moves
|
all be declared to avoid unwanted effects like turning all potential moves
|
||||||
into more expensive copies, or making a class move-only.
|
into more expensive copies, or making a class move-only.
|
||||||
|
|
||||||
##### Example, bad
|
##### Example, bad
|
||||||
|
|
||||||
struct M2 { // bad: incomplete set of default operations
|
struct M2 { // bad: incomplete set of copy/move/destructor operations
|
||||||
public:
|
public:
|
||||||
// ...
|
// ...
|
||||||
// ... no copy or move operations ...
|
// ... no copy or move operations ...
|
||||||
@@ -4622,12 +4618,12 @@ Given that "special attention" was needed for the destructor (here, to deallocat
|
|||||||
|
|
||||||
##### Note
|
##### Note
|
||||||
|
|
||||||
This is known as "the rule of five" or "the rule of six", depending on whether you count the default constructor.
|
This is known as "the rule of five."
|
||||||
|
|
||||||
##### Note
|
##### Note
|
||||||
|
|
||||||
If you want a default implementation of a default operation (while defining another), write `=default` to show you're doing so intentionally for that function.
|
If you want a default implementation (while defining another), write `=default` to show you're doing so intentionally for that function.
|
||||||
If you don't want a default operation, suppress it with `=delete`.
|
If you don't want a generated default function, suppress it with `=delete`.
|
||||||
|
|
||||||
##### Example, good
|
##### Example, good
|
||||||
|
|
||||||
@@ -4672,7 +4668,7 @@ Relying on an implicitly generated copy operation in a class with a destructor i
|
|||||||
|
|
||||||
##### Note
|
##### Note
|
||||||
|
|
||||||
Writing the six special member functions can be error prone.
|
Writing these functions can be error prone.
|
||||||
Note their argument types:
|
Note their argument types:
|
||||||
|
|
||||||
class X {
|
class X {
|
||||||
@@ -4690,7 +4686,7 @@ To avoid the tedium and the possibility of errors, try to follow the [rule of ze
|
|||||||
|
|
||||||
##### Enforcement
|
##### Enforcement
|
||||||
|
|
||||||
(Simple) A class should have a declaration (even a `=delete` one) for either all or none of the special functions.
|
(Simple) A class should have a declaration (even a `=delete` one) for either all or none of the copy/move/destructor functions.
|
||||||
|
|
||||||
### <a name="Rc-matched"></a>C.22: Make default operations consistent
|
### <a name="Rc-matched"></a>C.22: Make default operations consistent
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user