Function pointers/delegates default args were stealth removed?

Steven Schveighoffer schveiguy at yahoo.com
Wed Aug 29 07:34:09 PDT 2012


On Tue, 28 Aug 2012 04:57:53 -0400, Don Clugston <dac at nospam.com> wrote:

> On 27/08/12 16:16, Steven Schveighoffer wrote:
>> On Sun, 26 Aug 2012 18:26:40 -0400, Manu <turkeyman at gmail.com> wrote:
>>
>>> I just updated to 2.60 and found errors throughout my code where  
>>> function
>>> pointers default args no longer work.
>>> *Every single project* I've written in D, 5 projects, don't work  
>>> anymore,
>>> including my projects at work.
>>
>> OK, I've read all the posts on this, and this is what I think would
>> solve the problem:
>>
>> 1. default parameters are part of the function pointer type, because a
>> function pointer has a type.
>> 2. The mangled name of the function that is assigned to that function
>> pointer does *not* have default parameters mangled in.  Only the
>> function pointer type has them.
>> 3. Since the default parameters are part of the type, but not defined by
>> the function it points to, you can use interchangeably functions of the
>> same type which define default parameters or not (or define different
>> ones).  The default parameters follow the function pointer variable.
>
> This sounds like sloppy thinking.
> I _think_ what you are saying is that there should be implicit  
> conversions from one function pointer type, to any other that has the  
> same basic declaration, but different default arguments.
>
> But then you get problems with IFTI.
> void foo( void function(int x), double) {}
> void foo( void function(int x), int) {}
>
> void function(int x = 10) bar;
>
> foo(bar, 5); // fails -- ambiguous. Both overloads match with implicit  
> conversions.

First, I don't see IFTI anywhere in there.

Second, why is this a problem?  We already have oddities in terms of how  
implicitly converting one argument makes the interpretation of  
non-ambiguous arguments ambiguous.

I don't think it's sloppy, my logic is: we can already (I think) do this  
in library code, so why is it impossible for the compiler to figure out?

> But really, it seems to me that this whole feature is just syntax sugar  
> for one special case of currying.

Probably.  But it is what it is -- a poorly implemented/designed language  
feature.  In most cases, we don't simply drop them without giving a  
replacement.  Examples: octal literals, complex numbers, scope classes.

-Steve


More information about the Digitalmars-d mailing list