Built-in array opSliceAssign
    Stanislav Blinov 
    stanislav.blinov at gmail.com
       
    Thu Oct 25 19:56:18 UTC 2018
    
    
  
On Thursday, 25 October 2018 at 13:22:36 UTC, Eduard Staniloiu 
wrote:
>> The spec doesn't exactly say it uses memset, but it does imply 
>> it:
>>
>> https://dlang.org/spec/arrays.html#array-copying
>>
>> talking about "aggressive parallel code optimizations than 
>> possible with the serial semantics of C" and "copying" rather 
>> than "assigned" etc.
>>
>> but indeed postblit lets this work.
>
> You are right. Thank you!
>
> I guess I never read/understood it like this.
> I expected it to use opAssign as that is what's the most 
> natural and intuitive decision for me.
>
> I take it that this is the expected behaviour, then.
I don't think interpreting the spec like that is correct. It says 
"...it means that the *contents* of the array are the target of 
the *assignment*...", and further, in the examples:
s[1..2] = t[0..1]; // same as s[1] = t[0]
s[0..2] = t[1..3]; // same as s[0] = t[1], s[1] = t[2]
The current behavior of the compiler is quite the opposite of 
those "same as" above.
Consider:
struct S {
     @disable this(this); // can't implicitly copy, i.e. pass 
lvalue to a function
     void opAssign(ref S rhs) { /* ... */ } // but can explicitly 
copy
}
void main() {
     S x, y;
     x = y; // works
     S[10] a;
     a[0 .. 3] = y;         // doesn't compile, i.e. NOT "same as 
a[0] = y, a[1] = y, a[2] = y"
     a[0 .. 3] = a[3 .. 6]; // doesn't compile either, i.e. NOT 
"same as a[0] = a[3], a[1] = a[4], a[2] = a[5]"
}
I've filed an issue about this around a month ago: 
https://issues.dlang.org/show_bug.cgi?id=19274
    
    
More information about the Digitalmars-d-learn
mailing list