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