Can’t use UFCS to create InputRange?

Ogi ogion.art at gmail.com
Wed Apr 29 08:34:53 UTC 2020


struct R {}
int front(R r) { return 42; }
void popFront(R r) {}
bool empty(R r) { return false; }

void main() {
     import std.range.primitives : isInputRange;
     static assert(isInputRange!R);
}

> Error: static assert:  `isInputRange!(R)` is false

Whats really weird is that if I replace isInputRange with its 
definition from std.range.primitives, it returns true:

import std;

struct R {}
int front(R r) { return 42; }
void popFront(R r) {}
bool empty(R r) { return false; }

void main() {
     static assert(is(typeof(R.init) == R)
             && is(ReturnType!((R r) => r.empty) == bool)
             && is(typeof((return ref R r) => r.front))
             && !is(ReturnType!((R r) => r.front) == void)
             && is(typeof((R r) => r.popFront)));
}
This compiles.

What’s going on here?


More information about the Digitalmars-d-learn mailing list