You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CppCoreGuidelines.md
+31-36Lines changed: 31 additions & 36 deletions
Original file line number
Diff line number
Diff line change
@@ -5504,8 +5504,6 @@ This rule applies to all the usual comparison operators: `!=`, `<`, `<=`, `>`, a
5504
5504
5505
5505
* Flag a virtual `operator==()`; same for other comparison operators: `!=`, `<`, `<=`, `>`, and `>=`.
5506
5506
5507
-
5508
-
5509
5507
### <a name="Rc-hash"></a>C.89: Make a `hash` `noexcept`
5510
5508
5511
5509
##### Reason
@@ -5698,7 +5696,6 @@ Interfaces should normally be composed entirely of public pure virtual functions
5698
5696
The `Derived` is `delete`d through its `Goof` interface, so its `string` is leaked.
5699
5697
Give `Goof` a virtual destructor and all is well.
5700
5698
5701
-
5702
5699
##### Enforcement
5703
5700
5704
5701
* Warn on any class that contains data members and also has an overridable (non-`final`) virtual function.
@@ -6116,7 +6113,6 @@ However, misuses are (or at least has been) far more common.
6116
6113
6117
6114
Flag uses of `final`.
6118
6115
6119
-
6120
6116
## <a name="Rh-virtual-default-arg"></a>C.140: Do not provide different default arguments for a virtual function and an overrider
6121
6117
6122
6118
##### Reason
@@ -9634,7 +9630,6 @@ In general, don't complicate your code without reason (??)
9634
9630
Never write `return move(local_variable);`, because the language already knows the variable is a move candidate.
9635
9631
Writing `move` in this code won't help, and can actually be detrimental because on some compilers it interferes with RVO (the return value optimization) by creating an additional reference alias to the local variable.
9636
9632
9637
-
9638
9633
##### Example, bad
9639
9634
9640
9635
vector<int> v = std::move(make_vector()); // bad; the std::move is entirely redundant
@@ -15004,7 +14999,7 @@ If the class definition and the constructor body are in separate files, the long
### <a name="TBD"></a>Use of `=`, `{}`, and `()` as initializers
15010
15005
@@ -15016,7 +15011,7 @@ If your design wants virtual dispatch into a derived class from a base class con
15016
15011
15017
15012
* *Pass the buck:* Just document that user code must call the post-initialization function right after constructing an object.
15018
15013
* *Post-initialize lazily:* Do it during the first call of a member function. A Boolean flag in the base class tells whether or not post-construction has taken place yet.
15019
-
* *Use virtual base class semantics:* Language rules dictate that the constructor most-derived class decides which base constructor will be invoked; you can use that to your advantage. (See [[Taligent94]](#Taligent94).)
15014
+
* *Use virtual base class semantics:* Language rules dictate that the constructor most-derived class decides which base constructor will be invoked; you can use that to your advantage. (See [\[Taligent94\]](#Taligent94).)
15020
15015
* *Use a factory function:* This way, you can easily force a mandatory invocation of a post-constructor function.
15021
15016
15022
15017
Here is an example of the last option:
@@ -15071,7 +15066,7 @@ If the requirements above are met, the design guarantees that `PostInitialize` h
15071
15066
15072
15067
In summary, no post-construction technique is perfect. The worst techniques dodge the whole issue by simply asking the caller to invoke the post-constructor manually. Even the best require a different syntax for constructing objects (easy to check at compile time) and/or cooperation from derived class authors (impossible to check at compile time).
### <a name="Sd-dtor"></a>Discussion: Make base class destructors public and virtual, or protected and nonvirtual
15077
15072
@@ -15142,7 +15137,7 @@ In this rare case, you could make the destructor public and nonvirtual but clear
15142
15137
15143
15138
In general, however, avoid concrete base classes (see Item 35). For example, `unary_function` is a bundle-of-typedefs that was never intended to be instantiated standalone. It really makes no sense to give it a public destructor; a better design would be to follow this Item's advice and give it a protected nonvirtual destructor.
### <a name="Sd-noexcept"></a>Discussion: Usage of noexcept
15148
15143
@@ -15216,9 +15211,9 @@ These are key functions that must not fail because they are necessary for the tw
15216
15211
15217
15212
Consider the following advice and requirements found in the C++ Standard:
15218
15213
15219
-
> If a destructor called during stack unwinding exits with an exception, terminate is called (15.5.1). So destructors should generally catch exceptions and not let them propagate out of the destructor. --[[C++03]](#C++03) §15.2(3)
15214
+
> If a destructor called during stack unwinding exits with an exception, terminate is called (15.5.1). So destructors should generally catch exceptions and not let them propagate out of the destructor. --[\[C++03\]](#C++03) §15.2(3)
15220
15215
>
15221
-
> No destructor operation defined in the C++ Standard Library (including the destructor of any type that is used to instantiate a standard library template) will throw an exception. --[[C++03]](#C++03) §17.4.4.8(3)
15216
+
> No destructor operation defined in the C++ Standard Library (including the destructor of any type that is used to instantiate a standard library template) will throw an exception. --[\[C++03\]](#C++03) §17.4.4.8(3)
15222
15217
15223
15218
Deallocation functions, including specifically overloaded `operator delete` and `operator delete[]`, fall into the same category, because they too are used during cleanup in general, and during exception handling in particular, to back out of partial work that needs to be undone.
15224
15219
Besides destructors and deallocation functions, common error-safety techniques rely also on `swap` operations never failing--in this case, not because they are used to implement a guaranteed rollback, but because they are used to implement a guaranteed commit. For example, here is an idiomatic implementation of `operator=` for a type `T` that performs copy construction followed by a call to a no-fail `swap`:
@@ -15234,7 +15229,7 @@ Fortunately, when releasing a resource, the scope for failure is definitely smal
15234
15229
15235
15230
When using exceptions as your error handling mechanism, always document this behavior by declaring these functions `noexcept`. (See Item 75.)
## <a name="Sd-consistent"></a>Define Copy, move, and destroy consistently
15240
15235
@@ -15320,7 +15315,7 @@ Prefer compiler-generated (including `=default`) special members; only these can
15320
15315
In rare cases, classes that have members of strange types (such as reference members) are an exception because they have peculiar copy semantics.
15321
15316
In a class holding a reference, you likely need to write the copy constructor and the assignment operator, but the default destructor already does the right thing. (Note that using a reference member is almost always wrong.)
@@ -15724,49 +15719,49 @@ Alternatively, we will decide that no change is needed and delete the entry.
15724
15719
# Bibliography
15725
15720
15726
15721
* <a name="Alexandrescu01"></a>
15727
-
[Alexandrescu01]: A. Alexandrescu. Modern C++ Design (Addison-Wesley, 2001).
15722
+
\[Alexandrescu01]: A. Alexandrescu. Modern C++ Design (Addison-Wesley, 2001).
15728
15723
* <a name="Cplusplus03"></a>
15729
-
[C++03]: ISO/IEC 14882:2003(E), Programming Languages — C++ (updated ISO and ANSI C++ Standard including the contents of (C++98) plus errata corrections).
15724
+
\[C++03]: ISO/IEC 14882:2003(E), Programming Languages — C++ (updated ISO and ANSI C++ Standard including the contents of (C++98) plus errata corrections).
15730
15725
* <a name="CplusplusCS"></a>
15731
-
[C++CS]:
15726
+
\[C++CS]:
15732
15727
* <a name="Cargill92"></a>
15733
-
[Cargill92]: T. Cargill. C++ Programming Style (Addison-Wesley, 1992).
15728
+
\[Cargill92]: T. Cargill. C++ Programming Style (Addison-Wesley, 1992).
15734
15729
* <a name="Cline99"></a>
15735
-
[Cline99]: M. Cline, G. Lomow, and M. Girou. C++ FAQs (2ndEdition) (Addison-Wesley, 1999).
15730
+
\[Cline99]: M. Cline, G. Lomow, and M. Girou. C++ FAQs (2ndEdition) (Addison-Wesley, 1999).
15736
15731
* <a name="Dewhurst03"></a>
15737
-
[Dewhurst03]: S. Dewhurst. C++ Gotchas (Addison-Wesley, 2003).
15732
+
\[Dewhurst03]: S. Dewhurst. C++ Gotchas (Addison-Wesley, 2003).
15738
15733
* <a name="Henricson97"></a>
15739
-
[Henricson97]: M. Henricson and E. Nyquist. Industrial Strength C++ (Prentice Hall, 1997).
15734
+
\[Henricson97]: M. Henricson and E. Nyquist. Industrial Strength C++ (Prentice Hall, 1997).
15740
15735
* <a name="Koenig97"></a>
15741
-
[Koenig97]: A. Koenig and B. Moo. Ruminations on C++ (Addison-Wesley, 1997).
15736
+
\[Koenig97]: A. Koenig and B. Moo. Ruminations on C++ (Addison-Wesley, 1997).
15742
15737
* <a name="Lakos96"></a>
15743
-
[Lakos96]: J. Lakos. Large-Scale C++ Software Design (Addison-Wesley, 1996).
15738
+
\[Lakos96]: J. Lakos. Large-Scale C++ Software Design (Addison-Wesley, 1996).
15744
15739
* <a name="Meyers96"></a>
15745
-
[Meyers96]: S. Meyers. More Effective C++ (Addison-Wesley, 1996).
15740
+
\[Meyers96]: S. Meyers. More Effective C++ (Addison-Wesley, 1996).
15746
15741
* <a name="Meyers97"></a>
15747
-
[Meyers97]: S. Meyers. Effective C++ (2nd Edition) (Addison-Wesley, 1997).
15742
+
\[Meyers97]: S. Meyers. Effective C++ (2nd Edition) (Addison-Wesley, 1997).
15748
15743
* <a name="Meyers15"></a>
15749
-
[Meyers15]: S. Meyers. Effective Modern C++ (O'Reilly, 2015).
15744
+
\[Meyers15]: S. Meyers. Effective Modern C++ (O'Reilly, 2015).
15750
15745
* <a name="Murray93"></a>
15751
-
[Murray93]: R. Murray. C++ Strategies and Tactics (Addison-Wesley, 1993).
15746
+
\[Murray93]: R. Murray. C++ Strategies and Tactics (Addison-Wesley, 1993).
15752
15747
* <a name="Stroustrup00"></a>
15753
-
[Stroustrup00]: B. Stroustrup. The C++ Programming Language (Special 3rdEdition) (Addison-Wesley, 2000).
15748
+
\[Stroustrup00]: B. Stroustrup. The C++ Programming Language (Special 3rdEdition) (Addison-Wesley, 2000).
15754
15749
* <a name="Stroustrup05"></a>
15755
-
[Stroustrup05]: B. Stroustrup. [A rationale for semantically enhanced library languages](http://www.stroustrup.com/SELLrationale.pdf).
15750
+
\[Stroustrup05]: B. Stroustrup. [A rationale for semantically enhanced library languages](http://www.stroustrup.com/SELLrationale.pdf).
15756
15751
* <a name="Stroustrup13"></a>
15757
-
[Stroustrup13]: B. Stroustrup. [The C++ Programming Language (4th Edition)](http://www.stroustrup.com/4th.html). Addison Wesley 2013.
15752
+
\[Stroustrup13]: B. Stroustrup. [The C++ Programming Language (4th Edition)](http://www.stroustrup.com/4th.html). Addison Wesley 2013.
15758
15753
* <a name="Stroustrup14"></a>
15759
-
[Stroustrup14]: B. Stroustrup. [A Tour of C++](http://www.stroustrup.com/Tour.html).
15754
+
\[Stroustrup14]: B. Stroustrup. [A Tour of C++](http://www.stroustrup.com/Tour.html).
15760
15755
Addison Wesley 2014.
15761
15756
* <a name="SuttHysl04b"></a>
15762
-
[SuttHysl04b]: H. Sutter and J. Hyslop. "Collecting Shared Objects" (C/C++ Users Journal, 22(8), August 2004).
15757
+
\[SuttHysl04b]: H. Sutter and J. Hyslop. "Collecting Shared Objects" (C/C++ Users Journal, 22(8), August 2004).
15763
15758
* <a name="SuttAlex05"></a>
15764
-
[SuttAlex05]: H. Sutter and A. Alexandrescu. C++ Coding Standards. Addison-Wesley 2005.
15759
+
\[SuttAlex05]: H. Sutter and A. Alexandrescu. C++ Coding Standards. Addison-Wesley 2005.
15765
15760
* <a name="Sutter00"></a>
15766
-
[Sutter00]: H. Sutter. Exceptional C++ (Addison-Wesley, 2000).
15761
+
\[Sutter00]: H. Sutter. Exceptional C++ (Addison-Wesley, 2000).
15767
15762
* <a name="Sutter02"></a>
15768
-
[Sutter02]: H. Sutter. More Exceptional C++ (Addison-Wesley, 2002).
15763
+
\[Sutter02]: H. Sutter. More Exceptional C++ (Addison-Wesley, 2002).
15769
15764
* <a name="Sutter04"></a>
15770
-
[Sutter04]: H. Sutter. Exceptional C++ Style (Addison-Wesley, 2004).
15765
+
\[Sutter04]: H. Sutter. Exceptional C++ Style (Addison-Wesley, 2004).
15771
15766
* <a name="Taligent94"></a>
15772
-
[Taligent94]: Taligent's Guide to Designing Programs (Addison-Wesley, 1994).
15767
+
\[Taligent94]: Taligent's Guide to Designing Programs (Addison-Wesley, 1994).
0 commit comments