On 4/20/18 6:46 PM, Giles Bathgate wrote:
On Friday, 20 April 2018 at 22:21:13 UTC, Jonathan M Davis wrote:
Honestly, I think that it's a terrible idea to special-case it like
that. If we want to argue for making it work in the language, that's
fine, but if we special-case it like this, then it will work with some
functions that have lazy parameters and not others, and the result
will be confusing. Besides, all it takes to be able to pass a lamdba
or delegate to a lazy parameter is to actually call it when passing
it. So, if you add parens after the braces, it works. There's no need
to go and add a special case for it to the function.
Again lack of experience, so I presume you can just do:
bool inserted = false;
auto p = aa.getOrAdd("key", {inserted = true; return new Person; }());
I hadn't realised that until now. I enjoy your brutal honesty by the way ;)
The drawback here, of course, is that it's a lambda calling a lambda (if
you end up using the value).
But of course, your overload was the same thing.
I'm just surprised it doesn't work, especially when this works:
// lazy variadic
void foo(int delegate()[] dgs...)
{
dgs[0]();
}
foo(1); // ok, same as { return 1; }
foo({inserted = true; return 1;}); // ok
Of course, it's not as nice syntax inside the function.
-Steve