the const correctness of the this pointer

Jason House jason.james.house at gmail.com
Mon Dec 28 10:28:39 PST 2009


TM Wrote:

> Jason House Wrote:
> 
> > Steven Schveighoffer Wrote:
> > 
> > > 
> > > This might be a difficult thing to fix, but it definitely *definitely*  
> > > needs to be fixed.  The problem is that a delegate stores a function  
> > > pointer and a context pointer.  However, it does not type the context  
> > > pointer.  For example, if you do this:
> > > 
> > > import std.stdio;
> > > 
> > > class A
> > > {
> > >      void f() const {}
> > > }
> > > 
> > > void main()
> > > {
> > >      const A a = new A;
> > >      a.f();
> > >      auto g = &a.f;
> > >      writefln("%s", typeof(g).stringof);
> > > }
> > > 
> > > You will get this:
> > > 
> > > void delegate()
> > > 
> > > The this pointer is hidden, and so is it's const decoration.  I would  
> > > expect to see:
> > > 
> > > void delegate() const
> > > 
> > > I'll file a bugzilla request for this.
> > > 
> > > -Steve
> > 
> > 
> > I disagree. Once the delegate is passed off to some other region of code, why should that other code care that there's an object that might not get modified from using the delegate? Especially when you consider that which object or stack frame is not tracked by the type system. Pure delegates make sense to me though.
> 
> 
> I disagree with you. To me, the loss of the frame pointer's const attribute looks like a cast. 

The quoted code (by Steve) above is not the same as yours. Both the variable and the called member are const. Invoking the delegate does not violate the const system. I did respond to your original example saying to file a bugzilla entry.
 


> I do not expect to be allowed to call the above 'a.f' wihout casting a into a const A. And yet it is possible by using a delegate, which I think performs a hidden cast operation.
> 

Calling a const member function is allowed without casting from either thread-local mutable data or immutable data. Calling a non-const member function on a const object is what's illegal. That's what your original sample did. Constructing such a delegate (without casts) should be illegal and is a bug in dmd.

Once a const-correct delegate is created, it should be usable like any other delegate.



More information about the Digitalmars-d mailing list