Function literals can't be class members

John Colvin john.loughran.colvin at gmail.com
Tue Jul 9 04:26:02 PDT 2013


On Tuesday, 9 July 2013 at 11:03:34 UTC, JS wrote:
> On Tuesday, 9 July 2013 at 10:25:26 UTC, John Colvin wrote:
>> On Monday, 8 July 2013 at 22:41:41 UTC, JS wrote:
>>> trying to use a lambda inside a sub template gives an error.
>>>
>>> mixin template a
>>> {
>>>  template b()
>>>  {
>>>     enum b = { }();
>>>  }
>>>  mixin(b!());
>>> }
>>>
>>> gives the error in the subject, removing the nesting or using 
>>> a function instead of a lamda produces no error, yet all are 
>>> essentially semantically equivalent... just the lamda version 
>>> requires less typing. (in fact, it would be nice to have a 
>>> simplification of template b() = { ... }();)
>>
>> This belongs in D.learn.
>>
>> The code you provided is never going to give any "Function 
>> literals can't be class members" error, although it does have 
>> a lot of other things wrong with it.
>>
>> 1) The mixin template has no parameter list.
>> 2) enum b = { }(); isn't valid without a function body. Did 
>> you mean (){} ?
>> 3) and it definitely isn't going to return a string to work 
>> with mixin();
>>
>> It helps to give code examples that are at least syntactically 
>> correct, if not immediately compilable. A correct and 
>> simplified test case of what I *think* you are talking about 
>> is this:
>>
>> mixin template A()
>> {
>> 	auto foo = (){ };
>> }
>>
>> class C
>> {
>> 	mixin A!();
>> }
>>
>> Error: delegate f977.C.A!().__lambda1 function literals cannot 
>> be class members
>>
>> Lambda function and delegate literals cannot be class members. 
>> Function literals can. I'm not entirely sure on the reason 
>> why, it's probably to do with context pointers.
>
> Maybe you need to go tell Artur that he is wrong first before 
> you bitch at me for being wrong... 
> http://forum.dlang.org/thread/myalrxrrwoljxbboaymh@forum.dlang.org
>
>
> Please, at least if you are going to bitch and talk down to me 
> about writing valid source code at least know what you are 
> talking about in the first place...
>
>
> module main;
>
> import std.stdio, std.cstream;
>
> template b()
> {
> 	enum b = { return "\"asdf\"";  }();
> 	pragma(msg, b);
> }
>
> int main(string[] argv)
> {
> 	auto f = (){ writeln("asd"); };
> 	f();
> 	writeln(mixin(b!()));
> 	din.getc();
>     return 0;
> }

I am genuinely confused. Nothing in Arturs code or your example 
contains anything that is applicable to the 3 bullet points I 
wrote:

1) Neither contain any mixin templates
2) None use {}() without some content to the body.
3) Both bodies using that syntax explicitly return strings.


More information about the Digitalmars-d mailing list