Delegate type deduction compile error

anonymous via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sat Apr 25 07:41:05 PDT 2015


On Saturday, 25 April 2015 at 10:23:25 UTC, ref2401 wrote:
> struct MyStruct {}
>
> void main(string[] args) {
> 	string str = "blah-blah";
>
> 	auto d1 = (MyStruct) { writeln("delegate-str: ", str); };
>
> 	writeln(typeid(typeof(d1)));
> }
>
>
>
> dmd: 2067
> os: Win8.1
> build script: dmd main.d -ofconsole-app.exe -debug -unittest -wi
>
> - if delegate has no params or param is declared as 
> int/char/float then the code compiles successfully.
> 	auto d1 = (int) { writeln("delegate-str: ", str); };

This seems to be a special case for builtin types. Builtin types 
cannot be used for identifiers, so "int" is recognized as the 
type here.

> - if I declare named param as string or MyStruct then the code 
> compiles successfully too.
> 	auto d1 = (MyStruct ms)  { writeln("delegate-str: ", str); };

Here you give both type and name, so it's clear which is which, 
to both you and the compiler.

> - if I declare anonymous parameter as string or MyStruct then 
> the error compile occurs:
> 	auto d1 = (MyStruct)  { writeln("delegate-str: ", str); };
>
> main.d(21): Error: variable main.main.d1 type void is inferred 
> from initializer (MyStruct)
>
> {
>
> writeln("delegate-str: ", str);
>
> }
>
> , and variables cannot be of type void
> main.d(21): Error: template lambda has no value

Here "MyStruct" is interpreted as the _name_ of the parameter. 
Its type is inferred as void, because there's no context that 
says otherwise. Parameters cannot be typed void -> error.

Generally, in function literals, a single identifier is 
interpreted as the name, because the type can often be inferred 
from context. And then it's nice not having to write the type out.

> Why does it happen?


More information about the Digitalmars-d-learn mailing list