updating pages

This commit is contained in:
Andrew Pardoe
2017-12-11 11:27:52 -08:00
parent d1f5b4c455
commit 9a96d34e5c

View File

@@ -1,10 +1,9 @@
---
layout: default
---
# <a name="main"></a>C++ Core Guidelines
November 27, 2017
December 11, 2017
Editors:
@@ -86,7 +85,7 @@ You can sample rules for specific language features:
* `concept`:
[rules](#SS-concepts) --
[in generic programming](#Rt-raise) --
[template arguments](#RT-concepts) --
[template arguments](#Rt-concepts) --
[semantics](#Rt-low)
* constructor:
[invariant](#Rc-struct) --
@@ -1194,7 +1193,7 @@ Having good (easy-to-understand, encouraging efficient use, not error-prone, sup
Interface rule summary:
* [I.1: Make interfaces explicit](#Ri-explicit)
* [I.2: Avoid global variables](#Ri-global)
* [I.2: Avoid non-`const` global variables](#Ri-global)
* [I.3: Avoid singletons](#Ri-singleton)
* [I.4: Make interfaces precisely and strongly typed](#Ri-typed)
* [I.5: State preconditions (if any)](#Ri-pre)
@@ -1268,7 +1267,7 @@ Functions can be template functions and sets of functions can be classes or clas
* (Simple) A function should not make control-flow decisions based on the values of variables declared at namespace scope.
* (Simple) A function should not write to variables declared at namespace scope.
### <a name="Ri-global"></a>I.2: Avoid global variables
### <a name="Ri-global"></a>I.2: Avoid non-`const` global variables
##### Reason
@@ -1740,7 +1739,7 @@ Many traditional interface functions (e.g., UNIX signal handlers) use error code
##### Alternative
If you can't use exceptions (e.g. because your code is full of old-style raw-pointer use or because there are hard-real-time constraints), consider using a style that returns a pair of values:
If you can't use exceptions (e.g., because your code is full of old-style raw-pointer use or because there are hard-real-time constraints), consider using a style that returns a pair of values:
int val;
int error_code;
@@ -1793,7 +1792,7 @@ Consider:
return res;
}
Who deletes the returned `X`? The problem would be harder to spot if compute returned a reference.
Who deletes the returned `X`? The problem would be harder to spot if `compute` returned a reference.
Consider returning the result by value (use move semantics if the result is large):
vector<double> compute(args) // good
@@ -2223,7 +2222,7 @@ We might write
This violated the rule [against uninitialized variables](#Res-always),
the rule against [ignoring ownership](#Ri-raw),
and the rule [against magic constants](#Res-magic) .
and the rule [against magic constants](#Res-magic).
In particular, someone has to remember to somewhere write
if (owned) delete inp;
@@ -2257,7 +2256,7 @@ Presumably, a bit of checking for potential errors would be added in real code.
##### Enforcement
* Hard, it is hard to decide what rule-breaking code is essential
* flag rule suppression that enable rule-violations to cross interfaces
* Flag rule suppression that enable rule-violations to cross interfaces
# <a name="S-functions"></a>F: Functions
@@ -5972,6 +5971,7 @@ To prevent slicing, because the normal copy operations will copy only the base p
##### Example
class B { // GOOD: base class suppresses copying
public:
B(const B&) = delete;
B& operator=(const B&) = delete;
virtual unique_ptr<B> clone() { return /* B object */; }
@@ -6093,6 +6093,8 @@ A `unique_ptr` can be moved, but not copied. To achieve that its copy operations
auto pi3 {make()}; // OK, move: the result of make() is an rvalue
}
Note that deleted methods should be public.
##### Enforcement
The elimination of a default operation is (should be) based on the desired semantics of the class. Consider such classes suspect, but maintain a "positive list" of classes where a human has asserted that the semantics is correct.
@@ -12195,8 +12197,9 @@ If you really need to break out a loop, a `break` is typically better than alter
break;
case Warning:
write_event_log();
// Bad - implicit fallthrough
case Error:
display_error_window(); // Bad
display_error_window();
break;
}
@@ -12210,7 +12213,7 @@ It is easy to overlook the fallthrough. Be explicit:
write_event_log();
// fallthrough
case Error:
display_error_window(); // Bad
display_error_window();
break;
}
@@ -12224,7 +12227,7 @@ In C++17, use a `[[fallthrough]]` annotation:
write_event_log();
[[fallthrough]]; // C++17
case Error:
display_error_window(); // Bad
display_error_window();
break;
}
@@ -16291,7 +16294,7 @@ The ability to specify a meaningful semantics is a defining characteristic of a
&& has_multiply<T>
&& has_divide<T>;
template<Number N> auto algo(const N& a, const N& b) // use two numbers
template<Number N> auto algo(const N& a, const N& b)
{
// ...
return a + b;
@@ -17869,6 +17872,7 @@ If you intend for a class to match a concept, verifying that early saves users p
##### Example
class X {
public:
X() = delete;
X(const X&) = default;
X(X&&) = default;