insertInPlace differences between compilers
John McFarlane via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Nov 12 11:15:22 PST 2014
On Wednesday, 12 November 2014 at 00:31:31 UTC, Jesse Phillips
wrote:
> On Tuesday, 11 November 2014 at 20:53:51 UTC, John McFarlane
> wrote:
>> 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)
>
> I believe DMD is correct here and here is why:
>
> While the function is called "insert" the operation is actually
> an assignment. DMD initializes all arrays elements to the
> default value so your array position 0 actually contains an S
> already. This means the operation is equivalent to
>
> auto b = S();
> b = S();
>
> Since S is a value type you're actually making a modification
> 'c' as stored in 'b'. The compiler is unable to prove that
> there is no other reference to that same memory location
> (though in this case the variable is on the stack and the
> modification is local so such knowledge may be possible).
>
That makes sense. In the case that `c` is a class, do you think
I'd have any luck if I made it immutable?
>> 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
>
> You probably want std.traits.isAssignable
>
> pragma(msg, isAssignable!(S, S)); // False
That's exactly what I was looking for. Thank you.
More information about the Digitalmars-d-learn
mailing list