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 ?