> Exactly, there's nothing stopping a user from writing a range of char (an ASCII string for example), so I don't think that's a good approach.

Yes, I acknowledge that it's technically possible, but as I said, it would be *wrong* code. In a range context, ASCII must be represented with `ubyte`.

> I don't believe is(A : const(char[])) is correct either. That checks if A implicitly converts to const(char[]), so, for example, Foo below would pass the check, but ptr would not be a const(char)* and the function would fail or have unexpected behaviour.

Yes, AliasThis tends to subtly break generic constraints. We need a better assortment of standard traits to alleviate the need for deceptive `is(T : U)`-style checks.

> I believe what I have is correct.

I never said it wasn't; the problem is that it's a round-about way of expressing it.