Jason House Wrote:

> 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.

I totally agree that the problem is the conversion of a [ void delegate() 
const] to a [void delegate()]. 
I totally agree that we should be allowed to call the const-correct delegate 
once it has been created.

ie, this should be correct:

void delegate() g = cast ( void delegate() ) (f); //here a cast would be 
necessary
g(); //This would be OK, of course

Concerning the bugzilla, the problem is that adding the 'const' and 'share' 
properties of the frame pointer as a part of the delegate's type is more like a 
new feature than a compiler bug, isn't it ?
On the other hand, it looks like we all agree to say this is a must have 
feature. Do wee ?

 


Reply via email to