Right, thank you! The range object needs to be mutated to be iterated on, that explains it.

Although it looks like the opIndex on this particular range could guarantee constness: https://github.com/dlang/phobos/blob/v2.093.0/std/range/package.d#L8099

Here's a longer code snippet that gives some context on why I thought I needed a const range object. This Matrix class would have the chunks range object stored as a private property, and use it in its opIndex to look up values. I wanted to add the const qualifier to the opIndex method, since it doesn't mutate the Matrix state, and that's what surfaced this error.


class Matrix(T)
{
    private {
        T[] data;
        Chunks!(T[]) view;
    }

    this(size_t width, size_t height)
    {
        this.data = new int[width * height];
        this.view = data.chunks(width);
    }

T opIndex(size_t col, size_t row) /*const*/ // FIXME Can't be const because Chunks.opIndex isn't
    {
        return view[row][col];
    }
}

void main()
{
    auto matrix = new Matrix!int(10, 10);
    writeln(matrix[0, 0]);
}


Oh well, I'll try a different way!

Reply via email to