Fix predicate template implementations in std.traits and std.range

Use T.init property instead of void initializer, because it doesn't work if T is const or immutable type.

I must change a part of unit test for the bug 6935, because we cannot support ranges which overrides init property.

---

From [the mention](https://github.com/D-Programming-Language/dmd/pull/1162#issuecomment-9171327) by @donc, using `= void` in predicate is sometimes not good. Then we should use `T.init` or library solution (e.g. `defaultInit` in std.traits).

For almost cases, `T.init` is enough. But, void static array types don't have `.init` property. Then, if we want to treat *all* types, `defaultInit` is necessary I think.
(Furthermore, it seems to me acceptable that default initialized void static arrays have zero filled memory. But it is language spec issue.)