Added not about notation to Con.2

in response to #902
This commit is contained in:
Bjarne Stroustrup 2017-05-07 15:59:55 -04:00
parent 0a4844ecad
commit ad6f863152

View File

@ -1,6 +1,6 @@
# <a name="main"></a>C++ Core Guidelines # <a name="main"></a>C++ Core Guidelines
May 1, 2017 May 7, 2017
Editors: Editors:
@ -14676,6 +14676,34 @@ Example:
Note that this wrapper solution is a patch that should be used only when the declaration of `f()` cannot be be modified, Note that this wrapper solution is a patch that should be used only when the declaration of `f()` cannot be be modified,
e.g. because it is in a library that you cannot modify. e.g. because it is in a library that you cannot modify.
##### Note
A `const` member function can modify the value of an object that is `mutable` or accessed through a pointer member.
A common use is to maintain a cache rather than repeatedly do a complicated computation.
For example, here is a `Date` that caches (mnemonizes) its string representation to simplify repeated uses:
class Date {
public:
// ...
const string& string_ref() const
{
if (string_val=="") compute_string_rep();
return string_val;
}
// ...
private:
void compute_string_rep() const; // compute string representation and place it in string_val
mutable string string_val;
// ...
};
Another way of saying this is that `const`ness is not transitive.
It is possible for a `const` member function to change the value of `mutable` members and the value of objects accessed
through non-`const` pointers.
It is the job of the class to ensure such mutation is done only when it makes sense according to the semantics (invariants)
it offers to its users.
See also [PIMPL](#???).
##### Enforcement ##### Enforcement