[Bug 191] New: Cannot refer to member variable in default value for method parameter
Don Clugston
dac at nospam.com.au
Fri Jun 23 04:17:40 PDT 2006
Bruno Medeiros wrote:
> Don Clugston wrote:
>> Bruno Medeiros wrote:
>>> BCS wrote:
>>>> Deewiant wrote:
>>>>> All I can find about default parameters in the spec is at the
>>>>> "Functions" page,
>>>>> where they pop out of the blue in the phrase "A function
>>>>> parameter's default
>>>>> value is not inherited", which is all that's said about them. The
>> ....
>>>>
>>> Hum, quite a catch you got there! Not only should it be better
>>> documented, but maybe it shouldn't work this way.
>>> Perhaps the default values should be set not at the call site, but by
>>> the function itself (thus depending on it's run-time type, and not
>>> it's compile-time type),
>>
>> I'm almost certain that default values should work that way. They
>> should just be syntactic sugar for overloaded functions.
>> Right now, they have the same problem which C++ has -- there's no way
>> that a template can find out what the default values are, and the
>> default values can't be used by function pointers or delegates.
>> So for example,
>>
>> void foo(int a, int b=2, int c=3) {}
>>
>> void goo(int a, int b, int c) { }
>> void goo(int a, int b) { goo(a, b, 3); }
>> void goo(int a) { goo(a, 2, 3); }
>>
>> void function(int) boo;
>>
>> foo(7); // ok
>> goo(7); // ok
>>
>> boo = goo; // ok
>> boo(5);
>>
>> boo = foo; // doesn't compile -- why not?
>> boo(5);
>>
>>
>
> You meant:
> boo = &goo; // ok
> boo(5);
>
> boo = &foo; // doesn't compile -- why not?
>
>
> Anyway, "Why not?" ? How could that compile? Even with that syntatic
> sugar the problem would subsist: remember that the expression (&foo) has
> to be evaluable by itself, and if there are many overloads of foo there
> is no way (with that syntax at least) to choose the correct one. (DMD
> currently chooses the lexically first overload)
But the 'goo' example does compile. Why is there a difference between
'goo' and 'foo'?
AFAIK, default parameters were introduced (in C++) purely as syntactic
sugar, and AFAIK they are only ever used in that way. I think they
should be just syntactic sugar. As they exist in both D and C++, they
are a quirky language primitive which cannot be emulated in any other
way. They lead to some horrible corner cases.
More information about the Digitalmars-d-bugs
mailing list