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.

Reply via email to