Попробуйте это:
struct MyRange(T)
{
T[] buf;
@property ref T front() { return this.buf[0]; }
@property ref const(T) front() const { return this.buf[0]; }
}
Проблема в вашем примере заключается в том, что вы сделали front
const, но не возвращаемое значение, и компилятор не позволит вам избежать изменяемой ссылки на такие данные const.
Теперь я хотел бы отметить, что в целом не следует ожидать, что диапазоны констант будут работать очень хорошо. По своей природе они должны быть изменяемыми, чтобы выполнять итерацию по ним (поскольку вы не можете вызвать popFront
в диапазоне констант), поэтому вы не сможете сделать намного больше, чем просто с помощью front
и * 1009. * с постоянным диапазоном. Ситуация не была бы такой плохой, если бы вы могли неявно преобразовать диапазон const в диапазон tail-const, но это работает только с массивами, и никто еще не нашел хорошего способа сделать это с общими диапазонами. Так что, к сожалению, константные диапазоны на этом этапе практически бесполезны.