mirror of
https://github.com/isocpp/CppCoreGuidelines.git
synced 2024-03-22 13:30:58 +08:00
parent
0a4844ecad
commit
ad6f863152
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user