I'm trying to write a struct template that uses `insertInPlace`. However, it doesn't work with certain template type / compiler combinations. Consider the following:

    import std.range;
    struct S { const int c; }
    S[] a;
    insertInPlace(a, 0, S());

With DMD64 D Compiler v2.066.1, I get the following error:
/usr/include/dmd/phobos/std/array.d(1013): Error: cannot modify struct dest[i] S with immutable members /usr/include/dmd/phobos/std/array.d(1079): Error: template instance std.array.copyBackwards!(S) error instantiating ./d/my_source_file.d(12345): instantiated from here: insertInPlace!(S, S)

But with gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1), the same code compiles.

While I'm still trying to get to grips with mutability in D, I wonder which compiler/library's got it right or whether this is a difference in language versions. The error still occurs when I change the type of `c` to a const class which is the case I'd really like this to work for.

I can avoid `insertInPlace` on DMD with the following, much slower alternative:

    a = a[0..insertionPoint] ~ element ~ a[insertionPoint..$];

In the short term, could anybody suggest a `static if` expression to determine whether I can copy the type to the satisfaction of `copyBackwards`? I tried isMutable but that didn't seem to work.

Thanks, John

Reply via email to