On Mon, 28 Dec 2009 10:50:02 -0500, Jason House
<jason.james.ho...@gmail.com> 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.
It could be part of the interface for a function that takes a delegate
(i.e. I require that this delegate does not modify it's 'this' parameter).
But I agree, there could be issues -- if you don't care what the delegate
does (const or not), then how do you specify that?
I suppose we need delegate contravariance at that point -- a delegate to a
const function should implicitly casts to a delegate of a non-const
function. See http://d.puremagic.com/issues/show_bug.cgi?id=3075
This might be a good reason to revive that enhancement.
BTW, you also need to correctly mark shared functions, which *do* matter
as far as delegates go, since you need to synchronize access to the 'this'
pointer before calling the delegate.
-Steve