<html><head><meta http-equiv="Content-Type" content="text/html charset=iso-8859-1"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Oct 26, 2012, at 7:21 PM, Rik Cabanier &lt;<a href="mailto:cabanier@gmail.com">cabanier@gmail.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><br><br><div class="gmail_quote">On Fri, Oct 26, 2012 at 9:06 AM, Peter Kasting <span dir="ltr">&lt;<a href="mailto:pkasting@google.com" target="_blank">pkasting@google.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Fri, Oct 26, 2012 at 8:27 AM, Rik Cabanier <span dir="ltr">&lt;<a href="mailto:cabanier@gmail.com" target="_blank">cabanier@gmail.com</a>&gt;</span> wrote:<br></div><div class="gmail_extra"><div class="gmail_quote">
<div class="im"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
It is valid for a const method to return you a new object ie a const factory object.&nbsp;<div>In that case, const-ness would not be desired.</div></blockquote><div><br></div></div><div>Not really. &nbsp;The point of this thread is that such functions may not modify an object's state themselves, but they vend access that can be used by the caller to modify it.</div>

<div><br></div><div>Consider for example:</div><div><br></div><div>Child* Parent::getNewChild() const;&nbsp;</div></div></div></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>Assuming the Parent doesn't have a list of its children (questionable), we can implement this without mutable pointers. &nbsp;But then a caller can do:</div>

<div><br></div><div>Child* child = parent-&gt;getNewChild();<br>child-&gt;parent-&gt;mutate();</div></div></div></blockquote><div><br></div><div><div>this would only be possible if that parent object is casting away a 'const' somewhere or accessing a global non-const object.</div>
</div><div>Maybe there should be a rule that 'mutable' or 'const_cast' should not be allowed.</div></div></blockquote><br></div><div>I don't think that would be a good rule. The approach we try to take to 'const' is logical constness - a method can be const if it has no observable side effect. mutable is extremely useful for state that is not precomputed, but that is worth caching. Filling a cache to give an answer faster next time doesn't logically alter the object's state, even though on a literal level it alters internal state. You shouldn't need a non-const reference to an object just to call a getter that happens to cache its result. The fact that there is a cache at all is a hidden implementation detail. So in cases like this, it's useful to use 'mutable'.</div><div><br></div><div>Regards,</div><div>Maciej</div><div><br></div><br></body></html>