[Bug 191] New: Cannot refer to member variable in default value for method parameter
Jarrett Billingsley
kb3ctd2 at yahoo.com
Sun Jun 11 12:12:44 PDT 2006
"Deewiant" <deewiant.doesnotlike.spam at gmail.com> wrote in message
news:e6hp54$a2d$1 at digitaldaemon.com...
> For what it's worth, I don't see any sense in this restriction - how is a
> class's member different from any other variable in this situation?
Oh, wow, I didn't know that it allowed you to do this with other kinds of
variables. I always thought that the default parameter initializer had to
evaluate to a constant!
> Especially
> since the workaround is so simple, and isn't that all that default
> parameters
> are meant to do - overload the method into a form which takes one less
> parameter
> and passes the default value to the original?
Well, as far as I know, that's not how the compiler implements it. It just
keeps one copy of the function, and when it comes across a call that doesn't
have all the parameters, it rewrites the function call so that the unwritten
parameters use the parameter initializer. So there's no actual overloading
going on.
> They don't have to implement it
> that way, but that's how I see the semantics of it.
That might be the problem - depending on whether or not the default argument
was a member variable, it might end up adding complexity to the default
argument mechanism, since the value of a local variable can't really be
determined until _after_ the function has been called with a 'this'
reference. It would be like trying to do something like:
void func(int[] x, int y = x[5])
Since x[5] can't be determined until after func() has been called, it would
have to have multiple code paths for func; one which would be for taking a
y, and one which would determine y from the x argument.
Though it could possibly be added into the current mechanism, if you had a
class like:
class A
{
int x;
void func(int y = x)
{
writefln(y);
}
}
Then if you called func:
A a = new A;
a.func();
The compiler would know that the default initializer for the first argument
is the member variable x, and would then rewrite the call as:
a.func(a.x);
Possible, but kind of complicated.
Overloading a function to implement the default parameter with a member
variable as the initializer seems like a simple enough workaround until
(if?) this is fixed. I agree that it should be possible for consistency
with the ability to use other variables as default argument initializers,
but I don't know how many extra levels of complexity it adds.
More information about the Digitalmars-d-bugs
mailing list