Am 12.08.2010 15:13, schrieb simendsjo:
The spec doesn't mention anything about block statements in typeof
declarations.

//typeof({1}) a; // found } expecting ;
//typeof({1}()) b; // same as a
typeof(1) c; // int

I'm asking because isInputRange from std.range the idom from the b test:

template isInputRange(R)
{
enum bool isInputRange = is(typeof(
{
R r; // can define a range object
if (r.empty) {} // can test for empty
r.popFront; // can invoke next
auto h = r.front; // can get the front of the range
}()));
}


Also... The unittest contains
static assert(isInputRange!(int[]));
static assert(isInputRange!(char[]));

But arrays doesn't include these methods.. I don't understand a thing :(
The braces create an delegate which should be directly called after its creation (this do the parens). If you put this into typeof, this delegate will never be created, we just get the type of calling it. The type of calling a delegate is of course the delegate's return type which is automatically deduced. Your exampley a and b are invalid beacuse '1' is not a valid statement it's only a expression. 'return 1;' would work as expected. Why does the spec don't mention it? It's beacuse a delegate is always a valid expresion. typeof has no special case of braces.

Mafi

Reply via email to