[Issue 6695] typeof(this) does not take into account const/immutable attributes inside member functions

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Sep 20 12:16:29 PDT 2011


http://d.puremagic.com/issues/show_bug.cgi?id=6695



--- Comment #9 from luka8088 <luka8088 at owave.net> 2011-09-20 12:16:01 PDT ---
(In reply to comment #8)
> (In reply to comment #7)
> > I agree that maybe this is not a bug, but I don't agree with the explanation
> > ... 
> > 
> > Documentation says "Both immutable and const are transitive, which means that
> > any data reachable through an immutable reference is also immutable, and
> > likewise for const."
> 
> Note the key element here is *data*, not *functions*.
> 
> > So in this example:
> 
> [snip]
> 
> > From the documentation, both
> >   typeid(typeof(a1.b1.d))
> > and
> >   typeid(typeof(a1.b1.f))
> > should be either mutable or immutable, right ?
> 
> typeid(typeof(a1.b1.d)) is a method, not a piece of data.  In fact, when you
> say typeof(a1.b1.d), you might as well have written typeof(b.d).
> 
> There is a confusing concept to grasp, and it's made harder because of the
> terminology.  An immutable function is not actually immutable.  An immutable
> function is a member function that *can be called* on an immutable instance of
> the struct/class.  The immutable modifier only affects the 'this' pointer, even
> though it seems like it's applied to the entire function.
> 
> Remember that all member functions have a hidden this pointer?  If we were
> forced to write them out, then this:
> 
> struct S
> {
>    void foo () immutable {}
>    void foo2()     const {}
>    void foo3()           {}
> }
> 
> becomes this:
> 
> struct S
> {
>    void foo (ref immutable(S) this) {}
>    void foo2(ref     const(S) this) {}
>    void foo3(ref           S  this) {}
> }
> 
> Now you can see why its clear you cannot call for instance foo with a
> non-immutable instance of S.  The reason the modifiers are applied to the
> function is because there's no parameter for them to cling to -- the parameter
> is hidden.
> 
> If you want to discuss this more, I think the d.learn newsgroup is probably
> best, or you can email me directly.  I'd be happy to answer any questions on
> it.

OK, I understand it now, you are right, thank you very much for detailed
explanation !

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list