What to do about default function arguments

Steven Schveighoffer schveiguy at yahoo.com
Thu Apr 26 06:14:47 PDT 2012


On Thu, 26 Apr 2012 09:08:07 -0400, Steven Schveighoffer  
<schveiguy at yahoo.com> wrote:

> void main()
> {
>      auto a = (int x = 1) { return x;};
>      pure nothrow @safe int function(int) b = (int x) { return x;};
>      pragma(msg, typeof(a).stringof);
>      pragma(msg, typeof(b).stringof);
>      b = a; // ok
>      //a = b; // error
>
>      //b(); // error
> }
>
> output:
>
> int function(int x = 1) pure nothrow @safe
> int function(int)
>

Nevermind, I just realized it was ignoring my pure nothrow @safe for the  
declaration.  Moving it after the declaration results in:

void main()
{
     auto a = (int x = 1) { return x;};
     int function(int) pure nothrow @safe b = (int x) { return x;};
     pragma(msg, typeof(a).stringof);
     pragma(msg, typeof(b).stringof);
}

output:

int function(int x = 1) pure nothrow @safe
int function(int x = 1) pure nothrow @safe

which clearly mimics the auto behavior.  This is *really* no good, since  
it seems to be ignoring the explicit type that I specified.

IMO, the correct solution is to make the default argument part of the type  
(and don't let it affect things globally!), and make it derived from the  
version without a default arg.  I think Michel Fortin said the same thing.

-Steve


More information about the Digitalmars-d mailing list