On 08/03/2010 11:07 PM, Andrej Mitrovic wrote:
On Tue, Aug 3, 2010 at 10:23 PM, Philippe Sigaud <[email protected] <mailto:[email protected]>> wrote: On Tue, Aug 3, 2010 at 22:04, Andrej Mitrovic <[email protected] <mailto:[email protected]>> wrote: Oh and there's a shorter way to write this example, by using isInputRange from std.range, like so: if (isInputRange!R && is(typeof({x = fun(x, range.front);}))) Does this work, without the () after the } ? I haven't even noticed those. In the following, If I add the pair of ()'s I get void as a return type. If I remove them, I get void delegate(): writeln(typeid(typeof( delegate void () {int x = 1;}()))); // writes void writeln(typeid(typeof( delegate void () {int x = 1;}))); // writes void delegate() So I definitely need to add them. When not added the expression evaluates to void delegate(), which is a valid type and the constraint then passes. If I understood everything, this code in the constraint: is(typeof({x = fun(x, range.front);}() ))) creates an anonymous function, the compiler sees it's trying to access x so it makes it a delegate, and it infers that the function takes no arguments and the return type is void. Did I get this right?
You only need to call it if you want to check the return type. You cannot create a function with content that can't compile, so in this case, the () isn't needed.
Correct me if I'm wrong, of course. :)
